Database

Il arrive de faire des erreurs lorsqu’on travaille avec une base de données. Et dans ces moments là, on voudrait revenir en arrière et annuler ce qu’on a fait. Les transactions sont très utiles dans ce genre de situations.

Une transation a 4 propriétés dites ACID:

  • Atomicité: soit toutes les opérations d’une transaction sont exécutées soit aucune ne l’est
  • Cohérence: le système passera d’un état valide à un autre état valide
  • Isolation: chaque transaction s’exécute de manière indépendante des autres
  • Durabilité: le résultat les instructions d’une transaction confirmée est enregistré de manière durable dans la base

Deux classes permettent de gérer les transactions en C#, il s’agit de Transaction et TransationScope.

Transaction

Avec SQL Server, la classe qui représente une transaction s’appelle SqlTransaction.
Son utilisation est très simple.

    string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["conString"].ConnectionString;
    SqlTransaction objTrans = null;

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        objTrans = connection.BeginTransaction(); // on initialise notre transation

        SqlCommand sqlCmd = new SqlCommand("INSERT INTO Employees (LastName,FirstName) VALUES ('Alain','Pierre')", connection);                

        try
        {
             sqlCmd.Transaction = objTrans; // on affecte notre transation à la commande puis on l'exécute
             sqlCmd.ExecuteNonQuery();                    

             objTrans.Commit(); // si pas d'exception, les données sont écrites en base
        }
        catch (Exception ex)
        {
            objTrans.Rollback(); // sinon on annule la modification
        }
        finally
        {
            connection.Close();
        }
   }

TransationScope

Avec TransationScope, le framework gère les transactions à votre place. Entre la création du TransationScope et l’appel à sa méthode Complete() qui « commite » les données en base, on peut utiliser plusieurs commandes, plusieurs connexions. Pas besoin de créer d’autres objets, le Framework gère tout à notre place. Attention, lors de l’utilisation de plusieurs connexions, TransationScope crée des transactions distribuées très gourmandes en ressources.

            string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["conString"].ConnectionString;

            using (TransactionScope transactionScope = new TransactionScope())
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();

                    SqlCommand command1 = new SqlCommand("INSERT INTO Employees (LastName,FirstName) VALUES ('Jean','Paul')", connection);
                    SqlCommand command2 = new SqlCommand("INSERT INTO Employees (LastName,FirstName) VALUES ('John','Doe')", connection);

                    command1.ExecuteNonQuery();
                    command2.ExecuteNonQuery();
                }
                transactionScope.Complete();
            }

Avec, cette série d’articles, j’ai fait un tour d’horizon de ce que propose c# pour les bases de données. Dans mes exemples, je me suis servi de SQL Server mais il est possible d’utiliser d’autres bases de données comme MySQL. Le sujet est vaste, il y a des notions dont je n’ai pas parlées dans cet article, comme les procédures stockées.

Pour aller plus loin
CodeProject – All about transactionscope

Auteur : Daniel MINKO FASSINOU

Laisser un commentaire




Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.