sql >> Database teknologi >  >> RDS >> Mysql

Hvordan laver jeg mange SQL-forespørgsler som transaktioner?

Din lærer henviser til Transaktioner. De fleste relationelle databaser understøtter transaktioner, inklusive MySQL*. Transaktioner giver mulighed for atomær opførsel af flere CRUD-operationer. Dette betyder, at hvis en operation mislykkes, vil databasen rulle alle ændringer tilbage, som om ingen af ​​operationerne nogensinde fandt sted.

Husk, at de kører sekventielt , ikke samtidigt. Men da de er atomare, føles det som om det kører alt i en enkelt operation.

For at køre en transaktion ved hjælp af OleDbConnection klasse ved hjælp af C# kan du oprette en transaktion fra dit forbindelsesobjekt, forudsat at det er åbent. Husk dog, at i modsætning til en lagret procedure skal du manuelt begå eller rulle tilbage transaktionen.

Ved at udføre en transaktion bliver dette sæt af operationer 'permanente' for databasen. Efter begåelsen kan den ikke rulles tilbage.

En tilbagerulning er, når du nulstiller databasen til den tilstand, der eksisterede før påbegyndelse af transaktionen.

Nedenfor er et eksempel på oprettelse af en transaktion fra et OleDbConnection-objekt sammen med udførelse af en commit og to tilfælde, hvor du måske ønsker at rulle tilbage:

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

Her er MSDN-artiklen om OleDbConnection.BeginTransaction metode med et generisk eksempel svarende til det, jeg postede ovenfor.

REDIGER :
*Som @Clockwork-Muse påpegede i kommentarerne, afhænger MySQL's evne til at understøtte transaktioner af den underliggende motor, der bruges. Der er mange MySQL-motorer, men de to vigtigste er InnoDB og MyISAM. InnoDB KAN understøtter transaktioner, men det gør MyISAM IKKE .




  1. Opdater forespørgsel, der resulterer forkert

  2. loop en mysql-forespørgsel

  3. Valg af afgrænset streng som en tabel i Oracle sql

  4. Oracle PL/SQL - Hvordan opretter man en simpel matrixvariabel?