sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo hago muchas consultas SQL como transacciones?

Tu profesor se refiere a Transacciones. La mayoría de las bases de datos relacionales admiten transacciones, incluido MySQL*. Las transacciones permiten el comportamiento atómico de múltiples operaciones CRUD. Esto significa que si una operación falla, la base de datos revertirá los cambios realizados como si ninguna de las operaciones hubiera ocurrido nunca.

Tenga en cuenta que se ejecutan secuencialmente , no simultaneamente. Sin embargo, dado que son atómicos, se siente similar a ejecutar todo en una sola operación.

Para ejecutar una transacción usando OleDbConnection class usando C# puede crear una transacción desde su objeto de conexión, asumiendo que está abierto. Sin embargo, tenga en cuenta que, a diferencia de un procedimiento almacenado, debe confirmar o revertir manualmente la transacción.

Confirmar una transacción hace que ese conjunto de operaciones sea 'permanente' para la base de datos. Después de confirmarlo, no se puede deshacer.

Una reversión es cuando restablece la base de datos al estado que existía antes de iniciar la transacción.

A continuación se muestra un ejemplo de creación de una transacción a partir de un objeto OleDbConnection junto con la realización de una confirmación y dos casos en los que es posible que desee revertir:

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
         }
    }
}

Aquí está el artículo de MSDN sobre OleDbConnection.BeginTransaction método con un ejemplo genérico similar al que publiqué anteriormente.

EDITAR :
*Como @Clockwork-Muse señaló en los comentarios, la capacidad de MySQL para admitir transacciones depende del motor subyacente que se utilice. Hay muchos motores MySQL, pero los dos principales son InnoDB y MyISAM. InnoDB PUEDE admite transacciones, pero MyISAM NO .