Être conscient de la gestion de transaction (autocommit, explicite et implicite) pour votre base de données peut vous éviter d'avoir à restaurer des données à partir d'une sauvegarde.
Les transactions contrôlent les déclarations de manipulation des données pour garantir qu'elles sont atomiques. Être "atomique" signifie que la transaction se produit ou non. La seule façon de signaler l'achèvement de la transaction à la base de données est d'utiliser soit une instruction COMMIT
ou ROLLBACK
(conformément à l'ANSI-92, qui n'incluait malheureusement pas de syntaxe pour créer/débuter une transaction, donc c'est spécifique au fournisseur). COMMIT
applique les modifications (si présentes) effectuées dans la transaction. ROLLBACK
ignore toutes les actions qui ont eu lieu dans la transaction - hautement souhaitable lorsque qu'une déclaration UPDATE/DELETE fait quelque chose de non intentionnel.
Typiquement, les déclarations DML (Insert, Update, Delete) sont exécutées dans une transaction en autocommit - elles sont validées dès que la déclaration est exécutée avec succès. Ce qui signifie qu'il n'y a pas d'opportunité de revenir en arrière dans la base de données à l'état précédant l'exécution de la déclaration dans des cas comme le vôtre. Lorsqu'il y a une erreur, la seule option de restauration disponible est de reconstruire les données à partir d'une sauvegarde (si elle existe). Dans MySQL, l'autocommit est activé par défaut pour InnoDB - MyISAM ne prend pas en charge les transactions. Il peut être désactivé en utilisant :
SET autocommit = 0
Une transaction explicite est lorsque des déclarations sont encapsulées dans un bloc de code de transaction explicitement défini - pour MySQL, c'est START TRANSACTION
. Cela nécessite également une instruction explicite COMMIT
ou ROLLBACK
à la fin de la transaction. Les transactions imbriquées dépassent le cadre de ce sujet.
Les transactions implicites sont légèrement différentes des explicites. Elles ne nécessitent pas de définition explicite d'une transaction. Cependant, comme les transactions explicites, elles nécessitent une instruction COMMIT
ou ROLLBACK
à être fournie.
Conclusion
Les transactions explicites sont la solution la plus idéale - elles exigent une déclaration, COMMIT
ou ROLLBACK
, pour finaliser la transaction, et ce qui se passe est clairement indiqué pour que d'autres puissent le lire en cas de besoin. Les transactions implicites sont acceptables si vous travaillez avec la base de données de manière interactive, mais les instructions COMMIT
ne doivent être spécifiées que lorsque les résultats ont été testés et ont été complètement validés.
Cela signifie que vous devriez utiliser :
SET autocommit = 0;
START TRANSACTION;
UPDATE ...;
...et n'utilisez COMMIT;
que lorsque les résultats sont corrects.
Cela dit, les déclarations UPDATE et DELETE ne retournent généralement que le nombre de lignes affectées, sans détails spécifiques. Convertissez ces déclarations en déclarations SELECT & examinez les résultats pour garantir la précision avant de tenter la déclaration UPDATE/DELETE.
Addendum
Les déclarations de LDD (Langage de Définition de Données) sont automatiquement validées - elles ne nécessitent pas d'instruction COMMIT. Par ex : créations ou modifications de tables, index, procédures stockées, bases de données et vues.