Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie mache ich viele SQL-Abfragen als Transaktionen?

Ihr Lehrer bezieht sich auf Transaktionen. Die meisten relationalen Datenbanken unterstützen Transaktionen, einschließlich MySQL*. Transaktionen ermöglichen ein atomares Verhalten mehrerer CRUD-Operationen. Das bedeutet, wenn eine Operation fehlschlägt, wird die Datenbank alle vorgenommenen Änderungen rückgängig machen, als ob keine der Operationen jemals stattgefunden hätte.

Denken Sie daran, dass sie sequenziell ausgeführt werden , nicht gleichzeitig. Da sie jedoch atomar sind, fühlt es sich ähnlich an, als würde alles in einem einzigen Vorgang ausgeführt.

Um eine Transaktion mit OleDbConnection -Klasse mit C# können Sie eine Transaktion aus Ihrem Verbindungsobjekt erstellen, vorausgesetzt, es ist geöffnet. Beachten Sie jedoch, dass Sie im Gegensatz zu einer gespeicherten Prozedur die Transaktion manuell festschreiben oder rückgängig machen müssen.

Durch das Festschreiben einer Transaktion wird dieser Satz von Operationen für die Datenbank "permanent". Nach dem Festschreiben kann es nicht zurückgesetzt werden.

Ein Rollback ist, wenn Sie die Datenbank auf den Zustand zurücksetzen, der vor dem Start der Transaktion bestand.

Nachfolgend finden Sie ein Beispiel für die Erstellung einer Transaktion aus einem OleDbConnection-Objekt zusammen mit der Durchführung eines Commit und zwei Fällen, in denen Sie möglicherweise ein Rollback durchführen möchten:

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

Hier ist der MSDN-Artikel zum OleDbConnection.BeginTransaction Methode mit einem generischen Beispiel ähnlich dem, was ich oben gepostet habe.

BEARBEITEN :
*Wie @Clockwork-Muse in den Kommentaren betonte, hängt die Fähigkeit von MySQL, Transaktionen zu unterstützen, von der zugrunde liegenden Engine ab, die verwendet wird. Es gibt viele MySQL-Engines, aber die beiden wichtigsten sind InnoDB und MyISAM. InnoDB KANN Transaktionen unterstützen, MyISAM jedoch NICHT .