sql >> Database >  >> RDS >> Mysql

Hoe voer ik veel SQL-query's uit als transacties?

Je docent verwijst naar Transacties. De meeste relationele databases ondersteunen transacties, waaronder MySQL*. Transacties zorgen voor atomair gedrag van meerdere CRUD-bewerkingen. Dit betekent dat als een bewerking mislukt, de database alle aangebrachte wijzigingen terugdraait alsof geen van de bewerkingen ooit heeft plaatsgevonden.

Houd er rekening mee dat ze opeenvolgend worden uitgevoerd , niet tegelijkertijd. Omdat ze echter atomair zijn, voelt het alsof alles in één bewerking wordt uitgevoerd.

Om een ​​transactie uit te voeren met de OleDbConnection class met C# kunt u een transactie maken van uw verbindingsobject, ervan uitgaande dat het open is. Houd er echter rekening mee dat u, in tegenstelling tot een opgeslagen procedure, de transactie handmatig moet vastleggen of terugdraaien.

Door een transactie te plegen, wordt die reeks bewerkingen 'permanent' voor de database. Na het plegen kan het niet worden teruggedraaid.

Een rollback is wanneer u de database terugzet naar de staat die bestond voordat de transactie werd gestart.

Hieronder ziet u een voorbeeld van het maken van een transactie van een OleDbConnection-object samen met het uitvoeren van een vastlegging en twee gevallen waarin u mogelijk wilt terugdraaien:

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 is het MSDN-artikel over de OleDbConnection.BeginTransaction methode met een generiek voorbeeld vergelijkbaar met wat ik hierboven heb gepost.

BEWERKEN :
*Zoals @Clockwork-Muse in de opmerkingen aangaf, hangt het vermogen van MySQL om transacties te ondersteunen af ​​van de onderliggende engine die wordt gebruikt. Er zijn veel MySQL-engines, maar de twee belangrijkste zijn InnoDB en MyISAM. InnoDB KAN ondersteunt transacties, maar MyISAM doet NIET .




  1. Hoe de Meridiem Indicator (AM/PM) toe te voegen aan een tijdwaarde in Oracle

  2. Is er zoiets CASE-expressie in JPQL?

  3. Gegevens opvragen binnen JSON-arraygegevensveld

  4. Hoe alle resultaten van de tabelrij samenvoegen?