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

Come faccio a eseguire molte query SQL come transazioni?

Il tuo insegnante si riferisce a Transazioni. La maggior parte dei database relazionali supporta le transazioni, incluso MySQL*. Le transazioni consentono il comportamento atomico di più operazioni CRUD. Ciò significa che se un'operazione non riesce, il database eseguirà il rollback di tutte le modifiche apportate come se nessuna delle operazioni fosse mai avvenuta.

Tieni presente che vengono eseguiti in sequenza , non contemporaneamente. Tuttavia, poiché sono atomici, sembra simile all'esecuzione di tutto in una singola operazione.

Per eseguire una transazione utilizzando OleDbConnection class usando C# puoi creare una transazione dal tuo oggetto di connessione, supponendo che sia aperto. Tieni presente che, a differenza di una stored procedure, è necessario eseguire manualmente il commit o il rollback della transazione.

Il commit di una transazione rende l'insieme di operazioni "permanenti" nel database. Dopo aver eseguito il commit, non è possibile eseguire il rollback.

Un rollback si verifica quando reimposti il ​​database allo stato che esisteva prima dell'avvio della transazione.

Di seguito è riportato un esempio di creazione di una transazione da un oggetto OleDbConnection insieme all'esecuzione di un commit e due casi in cui potresti voler eseguire il rollback:

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

Ecco l'articolo MSDN sul OleDbConnection.BeginTransaction metodo con un esempio generico simile a quello che ho postato sopra.

MODIFICA :
*Come ha sottolineato @Clockwork-Muse nei commenti, la capacità di MySQL di supportare le transazioni dipende dal motore sottostante utilizzato. Esistono molti motori MySQL, ma i due principali sono InnoDB e MyISAM. InnoDB PUÒ supporta le transazioni, ma MyISAM NON .