sql >> Databasteknik >  >> RDS >> Mysql

Hur gör jag många SQL-frågor som transaktioner?

Din lärare syftar på Transaktioner. De flesta relationsdatabaser stöder transaktioner, inklusive MySQL*. Transaktioner möjliggör atomärt beteende för flera CRUD-operationer. Det betyder att om en operation misslyckas kommer databasen att återställa alla ändringar som gjordes som om ingen av operationerna någonsin inträffat.

Tänk på att de körs sekventiellt , inte samtidigt. Men eftersom de är atomära känns det som att det kör allt i en enda operation.

För att köra en transaktion med OleDbConnection klass med C# kan du skapa en transaktion från ditt anslutningsobjekt, förutsatt att det är öppet. Kom dock ihåg att till skillnad från med en lagrad procedur måste du manuellt utföra eller återställa transaktionen.

Genom att utföra en transaktion blir den uppsättningen av operationer "permanenta" i databasen. Efter att ha begått det kan det inte återställas.

En återställning är när du återställer databasen till det tillstånd som fanns innan transaktionen påbörjades.

Nedan är ett exempel på att skapa en transaktion från ett OleDbConnection-objekt tillsammans med att utföra en commit och två fall där du kanske vill återställa:

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

Här är MSDN-artikeln om OleDbConnection.BeginTransaction metod med ett generiskt exempel som liknar det jag postade ovan.

REDIGERA :
*Som @Clockwork-Muse påpekade i kommentarerna beror MySQL:s förmåga att stödja transaktioner på den underliggande motorn som används. Det finns många MySQL-motorer, men de två huvudsakliga är InnoDB och MyISAM. InnoDB KAN stöder transaktioner, men MyISAM gör det INTE .




  1. hur man kommer åt data från mysql

  2. MySQL InnoDB dödläge problem med två samma frågor (olika parametrar)

  3. Få antalet dagar mellan två datum i Oracle, inklusive datumen

  4. pq:funktionen unnest(okänd) är inte unik