sql >> Databáze >  >> RDS >> Mysql

Jak mohu provést mnoho SQL dotazů jako transakce?

Váš učitel má na mysli Transakce. Většina relačních databází podporuje transakce, včetně MySQL*. Transakce umožňují atomické chování více operací CRUD. To znamená, že pokud jedna operace selže, databáze vrátí zpět všechny provedené změny, jako by k žádné z operací nikdy nedošlo.

Mějte na paměti, že běží postupně , ne zároveň. Nicméně, protože jsou atomové, je to podobné, jako když běží vše v jediné operaci.

Chcete-li spustit transakci pomocí OleDbConnection třídy pomocí C# můžete vytvořit transakci z vašeho objektu připojení za předpokladu, že je otevřený. Mějte však na paměti, že na rozdíl od uložené procedury musíte transakci ručně potvrdit nebo vrátit zpět.

Potvrzením transakce se tato sada operací stane „trvalou“ v databázi. Po potvrzení jej nelze vrátit zpět.

Vrácení zpět je, když resetujete databázi do stavu, který existoval před zahájením transakce.

Níže je uveden příklad vytvoření transakce z objektu OleDbConnection spolu s provedením potvrzení a dva případy, kdy budete chtít vrátit zpět:

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

Zde je článek MSDN o OleDbConnection.BeginTransaction metoda s obecným příkladem podobným tomu, co jsem zveřejnil výše.

UPRAVIT :
*Jak @Clockwork-Muse zdůraznil v komentářích, schopnost MySQL podporovat transakce závisí na použitém základním enginu. Existuje mnoho enginů MySQL, ale dva hlavní jsou InnoDB a MyISAM. InnoDB UMÍ podporuje transakce, ale MyISAM NE .




  1. Jak vytvořím tabulku s omezeními při stahování dat z jiné tabulky

  2. [AKTUALIZOVÁNO 2] Kritické:Office Update přeruší přístup – Dotaz je poškozený

  3. Spusťte klienta Oracle v 32bitovém režimu na 64bitovém počítači

  4. Jak zacházet s různými typy uživatelů při přihlašování?