
Les transactions sont une fonctionnalité absolument indispensable, permettant de sécuriser une application utilisant une base de données. Sans elles, certaines opérations risqueraient d'être à moitié réalisées, et la moindre erreur, la moindre interruption pourrait avoir des conséquences énormes. Elles ont été implémentées assez tard dans MySQL, et qui plus est, elles ne sont pas utilisables pour tous les types de tables. Comprendre le fonctionnement des transactions et leur importance est crucial pour quiconque travaille avec des bases de données.
Les Fondamentaux des Transactions
Une transaction, c'est un ensemble de requêtes qui sont exécutées en un seul bloc. Pour illustrer cette notion, imaginez que Monsieur Durant fasse un virement de 300 euros à Monsieur Dupont via sa banque en ligne. Il remplit toutes les petites cases du virement, puis valide. Deux jours plus tard, Monsieur Durant reçoit un coup de fil de Monsieur Dupont, très énervé, qui lui demande pourquoi le paiement convenu n'a toujours pas été fait. La panne de courant qui a éteint les serveurs est survenue pile entre l'étape de débit du compte de Monsieur Durant et celle du crédit du compte de Monsieur Dupont. Si la banque de Monsieur Durant n'utilisait pas les transactions, il y aurait une incohérence grave : Monsieur Durant aurait été débité, mais Monsieur Dupont n'aurait jamais reçu les fonds.
Apprendre et maitriser SQL : Les transactions
Types de Tables et Support des Transactions
Il n'est pas possible d'utiliser les transactions sur n'importe quelle table. Par exemple, MyISAM ne supporte pas les contraintes de clés étrangères, ce qui rend l'utilisation des transactions impossible. Pour cette raison, il est souvent préférable de créer des tables avec le moteur InnoDB, qui supporte pleinement les transactions, ce qui tombe plutôt bien pour la suite. Lorsque l'on valide les requêtes d'une transaction, on dit aussi que l'on commite les changements.
Le Mode Autocommit : Fonctionnement par Défaut
Par défaut, MySQL ne travaille pas avec les transactions. Chaque requête effectuée est directement commitée (validée). On ne peut pas revenir en arrière. On peut donc en fait considérer que chaque requête constitue une transaction, qui est automatiquement commitée.
Pour désactiver ce mode, il faut utiliser la commande SET autocommit = 0;. Une fois que vous n'êtes plus en autocommit, chaque modification de donnée devra être commitée pour prendre effet.
Prenons un exemple concret. Faites maintenant un SELECT sur les tables Espece et Animal. Si vous avez désactivé l'autocommit et effectué des modifications, vous les verrez. Par exemple, les rats bruns valent maintenant 20 euros, et nos trois nouvelles bestioles ont bien été insérées. Cependant, si vous vous reconnectez et vérifiez vos données, vous constaterez que les rats valent de nouveau 10 euros, et que Baba, Bibo et Buba n'existent pas. Pourquoi ? Le mode autocommit est de nouveau activé ! Le fait de faire SET autocommit = 0; n'est valable que pour la session courante. Or, en ouvrant une nouvelle connexion, vous avez créé une nouvelle session.
L'Impact des Changements Non-Commités
Ensuite, tout en laissant ce client MySQL ouvert, ouvrez-en un deuxième. Connectez-vous comme d'habitude à la base de données elevage. Les commentaires de Bibo sont toujours vides. Les changements non-commités ne sont donc pas visibles à l'extérieur de la transaction qui les a faits. Annulez la modification de Bibo dans la première session avec un ROLLBACK.
Démarrage des Transactions
En désactivant le mode autocommit, en réalité, on démarre une transaction. Avec MySQL, il est également possible de démarrer une transaction avec BEGIN ou BEGIN WORK. Une fois la transaction ouverte, les requêtes devront être validées pour prendre effet. Il n'est pas possible de démarrer une transaction à l'intérieur d'une transaction. Par contre, on peut poser des jalons de transaction. On n'utilise qu'une seule transaction, on valide à la fin, et pourtant la seconde insertion n'a pas été faite au final, puisqu'elle a été annulée grâce au jalon. Ça, c'est la manière classique et recommandée.
Clôture Implicite des Transactions
Il faut savoir qu'un certain nombre d'autres commandes auront aussi pour effet de clôturer une transaction. Et pas seulement la clôturer, mais également valider toutes les requêtes qui ont été faites dans cette transaction. Toutes les commandes qui créent, modifient, suppriment des objets dans la base de données valident implicitement les transactions. Je vous ai signalé qu'il n'était pas possible d'imbriquer des transactions, donc d'avoir une transaction à l'intérieur d'une transaction.
Les Propriétés ACID des Transactions
Les critères définissant la fiabilité d'une transaction sont au nombre de quatre : Atomicité, Cohérence, Isolation et Durabilité.
Atomicité (Atomicity)
Une transaction doit être atomique, c'est-à-dire qu'elle doit former une entité complète et indivisible. Si l'on reprend l'exemple du virement bancaire, en utilisant les transactions, les deux étapes (débit du compte donneur d'ordre, crédit du compte bénéficiaire) ne peuvent exister indépendamment l'une de l'autre. Si l'une est exécutée, l'autre doit l'être également. Si une transaction en cours est interrompue, aucune des requêtes exécutées ne sera validée. De même, en cas d'erreur, il suffit de faire un ROLLBACK pour annuler toute la transaction.
Cohérence (Consistency)
Les données doivent rester cohérentes dans tous les cas : que la transaction se termine sans encombre, qu'une erreur survienne, ou que la transaction soit interrompue. Un virement dont seule l'étape de débit du donneur d'ordre est exécutée produit des données incohérentes (la disparition de 300 euros jamais arrivés chez le bénéficiaire). Avec une transaction, cette incohérence n'apparaît jamais. Oui, les changements de données ne sont validés qu'une fois que toutes les étapes ont été exécutées.
Isolation (Isolation)

Les transactions doivent être isolées les unes des autres. C'est-à-dire que les opérations effectuées par une transaction ne doivent pas être visibles par d'autres transactions tant que la première n'est pas entièrement validée. À nouveau, ouvrez une deuxième session, tout en laissant la première ouverte (démarrez un deuxième client SQL et connectez-vous à votre base de données). Le résultat n'est pas du tout le même dans les deux sessions. Par contre, dans la deuxième session, on a d'abord fait un SELECT, et Bibo n'a toujours pas de père (puisque ça n'a pas été commité dans la première session). Seulement voilà, la requête UPDATE ne fait rien !
Commitez maintenant les changements dans la première session (celle qui n'est pas bloquée). Il est possible que votre seconde session indique ceci : ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction. Cela signifie que la session est restée bloquée trop longtemps et que par conséquent la transaction a été automatiquement fermée (avec un rollback des requêtes effectuées). Il n'y a plus qu'à commiter les changements faits par la deuxième session, et c'est terminé ! Si vous ne commitez pas, commentaires restera NULL.
Ce blocage a pour effet d'empêcher la deuxième session d'écraser un changement fait par la première. Le blocage de la deuxième session vient en fait de ce que la première session, en faisant sa requête UPDATE, a automatiquement posé un verrou sur la ligne contenant Bobi le rat, empêchant toute modification tant que la transaction était en cours.
Je vous l'accorde, vous n'allez pas vous amuser tous les jours à ouvrir deux sessions MySQL. Prenons l'exemple simple d'un jeu par navigateur : de nombreux joueurs peuvent être connectés en même temps, et effectuer des opérations différentes. Si les transactions ne sont pas isolées, une partie des actions des joueurs risquerait de se voir annulées. On isole donc les transactions grâce aux verrous (qui sont ici automatiquement posés mais ce n'est pas toujours le cas). Oui, la première session provoque un retard dans l'exécution des requêtes de la deuxième session, mais les critères de fiabilité que nous examinons ici concernent les données impactées par les transactions, et non le déroulement de celles-ci (qui importe peu finalement).
Durabilité (Durability)
Une fois qu'une transaction est validée (commitée), ses modifications sont permanentes et survivent à toute panne du système (comme une panne de courant). Les données sont écrites de manière persistante sur le disque dur.
GRIMP : Au-delà des Bases de Données
Bien que le sujet principal ici soit la gestion des transactions dans les bases de données, il est intéressant de noter comment les principes de robustesse et de cohérence se retrouvent dans d'autres domaines, même si la référence directe à "GRIMP fenêtre gauche disparu" semble plus métaphorique ici, évoquant la perte d'une interface ou d'une visibilité essentielle. La gestion de la continuité et la résilience face aux imprévus sont des préoccupations universelles.

La crise sanitaire, par exemple, a ralenti une dynamique, sans pour autant la stopper dans de nombreux secteurs. C’est ainsi que l’on peut résumer les deux dernières années au sein du groupe hôtelier Inwood. Certes, les confinements à répétition ont contraint de fermer, jusqu’en juin 2021, les neuf établissements, répartis entre Paris, Bordeaux et Arcachon (Gironde). Fondé en 2008 par un indépendant français associé à un fonds d’investissement, Inwood Hotels compte désormais dix établissements en France. Paris et la région bordelaise sont, pour l’heure, privilégiées, “mais nous ne sommes fermés à aucune autre destination au sein de l’Hexagone”, confie Olivier Romain, directeur des opérations du groupe hôtelier. Actuellement, Inwood lorgne du côté de la Côte d’Azur, la montagne, mais aussi la rive gauche parisienne, “selon les opportunités”. Et ce d’autant que, durant l’été 2021, certaines adresses d’Inwood, à commencer par le boutique-hôtel Le B d’Arcachon, ont battu des records de fréquentation. De quoi redonner le moral aux équipes, en marge de la crise sanitaire.
Des équipes restées fidèles au groupe hôtelier. “Depuis le premier confinement, nous n’avons pas eu de départ aux postes clés”, constate Olivier Romain. À cela s’ajoute une attention portée à l’évolution professionnelle au sein du groupe. “Chez nous, on fait grandir : un stagiaire peut devenir, à terme, directeur d’établissement.” C’est d’ailleurs arrivé. Car Olivier Romain cultive “la méritocratie”, comme il dit. Et ça marche. Les salariés ont des perspectives de progression.
La priorité d’Inwood Hotels, pour l'année en cours, c’est le développement durable. Le groupe veut passer au vert. Dans un premier temps, Olivier Romain évoque la chasse au plastique. Fini les produits d’accueil en mini-flacons et les chaussons sont désormais glissés dans des sacs en coton. Fini aussi les bouteilles d’eau autrement qu’en verre. “Reste à organiser le recyclage de ce verre”, poursuit le directeur des opérations d’Inwood. Quant à Jérémy Auzanneau, directeur commercial et marketing du groupe hôtelier, il a déjà remplacé ses cartes de visites papier en QR code à télécharger directement sur un smartphone. “Notre objectif : l’éligibilité à l’écolabel européen de nos dix hôtels d’ici à la fin de l'année”, annonce Olivier Romain. Un pari ambitieux, mais le directeur des opérations mise sur cette sensibilisation au durable et au raisonnable pour renforcer le positionnement d’Inwood. Il veut marquer les esprits, aussi bien côté salariés que clientèle.
Parallèlement, le service est poussé vers l’excellence, avec cette volonté de “fédérer les équipes autour de l’expérience client”. Ainsi, l’Hôtel de la plage, à Arcachon, s’apprête à passer de 3 à 4 étoiles. Quant au Burdigala, à Bordeaux, il fait l’objet actuellement d’une vague de rénovations et transformations, menée par l’architecte d’intérieur Fabien Roque. Ces exemples démontrent comment la "durabilité" et la "cohérence" ne sont pas uniquement des concepts techniques mais des principes fondamentaux pour la pérennité et la réussite dans des contextes variés, même lorsqu'une "fenêtre gauche" - une fonctionnalité ou une approche habituelle - semble disparaître, obligeant à innover et à s'adapter.