Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como faço muitas consultas SQL como transações?


Seu professor está se referindo a Transações. A maioria dos bancos de dados relacionais suporta transações, incluindo MySQL*. As transações permitem o comportamento atômico de várias operações CRUD. Isso significa que, se uma operação falhar, o banco de dados reverterá todas as alterações feitas como se nenhuma das operações tivesse ocorrido.

Lembre-se de que eles estão sendo executados sequencialmente , não simultaneamente. No entanto, como eles são atômicos, parece semelhante a executar tudo em uma única operação.

Para executar uma transação usando o OleDbConnection class usando C#, você pode criar uma transação do seu objeto de conexão, supondo que esteja aberto. Tenha em mente que, diferentemente de um procedimento armazenado, você precisa confirmar ou reverter manualmente a transação.

A confirmação de uma transação torna esse conjunto de operações 'permanente' no banco de dados. Depois de confirmar, não pode ser revertido.

Uma reversão é quando você redefine o banco de dados para o estado que existia antes de iniciar a transação.

Abaixo está um exemplo de criação de uma transação de um objeto OleDbConnection juntamente com a execução de um commit e dois casos em que você pode querer reverter:
using(OleDbConnection con = DAL.GetConnection())
{
    OleDbTransaction transaction = null;
    try
    {
        con.Open();
        transaction = con.BeginTransaction()

        string queryString1 = //SQL string
        OleDbCommand cmd1 = new OleDbCommand();
        {
            Connection = con,
            CommandType = CommandType.Text,
            CommandText = queryString1
        };

        string queryString2 = //SQL string
        OleDbCommand cmd2 = new OleDbCommand();
        {
            Connection = con,
            CommandType = CommandType.Text,
            CommandText = queryString2
        };

        int num1 = cmd.ExecuteNonQuery();
        int num2 = cmd.ExecuteNonQuery();

        if (num1 == 0 || num2 == 0)
        {
            //We didn't expect something to return 0, lets roll back
            transaction.Rollback();
            //send error message
            Response.Redirect("register.aspx?err=Error");
        }
        else
        {
             //everything seems good, lets commit the transaction!
             transaction.Commit();
             Session["id"] = MyDB.GetUserId(uname);
             Response.Redirect("home.aspx");
        }
    }
    catch(OleDbException ex)
    {
         try
         {
             //something bad happened, lets roll everything back
             transaction.Rollback();
             Response.Redirect("register.aspx?err=Error");
         }
         catch
         {
             //we don't really care about this catch statement
         }
    }
}

Aqui está o artigo do MSDN sobre o OleDbConnection.BeginTransaction método com um exemplo genérico semelhante ao que postei acima.

EDITAR :
*Como @Clockwork-Muse apontou nos comentários, a capacidade do MySQL de suportar transações depende do mecanismo subjacente que está sendo usado. Existem muitos mecanismos MySQL, mas os dois principais são InnoDB e MyISAM. InnoDB PODE suporta transações, mas o MyISAM NÃO .