Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment puis-je effectuer de nombreuses requêtes SQL en tant que transactions ?

Votre enseignant fait référence aux transactions. La plupart des bases de données relationnelles prennent en charge les transactions, y compris MySQL*. Les transactions permettent un comportement atomique de plusieurs opérations CRUD. Cela signifie que si une opération échoue, la base de données annulera toutes les modifications apportées comme si aucune des opérations ne s'était jamais produite.

Gardez à l'esprit qu'ils s'exécutent séquentiellement , pas simultanément. Cependant, comme ils sont atomiques, cela ressemble à l'exécution de tout en une seule opération.

Pour exécuter une transaction à l'aide de OleDbConnection classe en utilisant C #, vous pouvez créer une transaction à partir de votre objet de connexion, en supposant qu'il est ouvert. Gardez à l'esprit que, contrairement à une procédure stockée, vous devez valider ou annuler manuellement la transaction.

La validation d'une transaction rend cet ensemble d'opérations "permanent" à la base de données. Après validation, il ne peut pas être annulé.

Une restauration se produit lorsque vous réinitialisez la base de données à l'état qui existait avant le démarrage de la transaction.

Vous trouverez ci-dessous un exemple de création d'une transaction à partir d'un objet OleDbConnection avec l'exécution d'un commit et deux cas où vous souhaiterez peut-être revenir en arrière :

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

Voici l'article MSDN sur le OleDbConnection.BeginTransaction méthode avec un exemple générique similaire à ce que j'ai posté ci-dessus.

MODIFIER :
*Comme @Clockwork-Muse l'a souligné dans les commentaires, la capacité de MySQL à prendre en charge les transactions dépend du moteur sous-jacent utilisé. Il existe de nombreux moteurs MySQL, mais les deux principaux sont InnoDB et MyISAM. InnoDB PEUT prend en charge les transactions, mais MyISAM PAS .