Chapitre 10 : BEGIN, COMMIT, ROLLBACK (pour aller plus loin, cours seul)
TCL : gérer les transactions
Que se passe-t-il si la base plante au milieu d'une série de modifications ? Pour que les données restent toujours cohérentes, le TCL, le langage de contrôle des transactions, regroupe plusieurs opérations en un tout indivisible.
Qu'est-ce qu'une transaction ?
Une transaction est un groupe d'opérations traité comme un seul bloc : soit tout réussit, soit rien n'est pris en compte.
Exemple classique, un virement de 100 euros : il faut retirer l'argent du compte 1 et le déposer sur le compte 2. Si la base plante entre les deux opérations, l'argent ne doit pas disparaître !
BEGIN, COMMIT et ROLLBACK
BEGIN;
UPDATE comptes SET solde = solde - 100 WHERE id = 1;
UPDATE comptes SET solde = solde + 100 WHERE id = 2;
COMMIT;BEGIN;
DELETE FROM comptes WHERE id = 1;
-- oups, ce n'était pas le bon compte
ROLLBACK;- BEGIN ouvre une transaction ;
- COMMIT valide toutes les opérations, de façon définitive ;
- ROLLBACK annule tout ce qui a été fait depuis le
BEGIN.
Les propriétés ACID
Un SGBD sérieux garantit quatre propriétés, résumées par le sigle ACID.
| Propriété | Garantie |
|---|---|
| Atomicité | tout ou rien : une transaction n'est jamais appliquée à moitié |
| Cohérence | les règles de la base (clés, contraintes) sont respectées avant et après |
| Isolation | des transactions simultanées ne se perturbent pas entre elles |
| Durabilité | une fois validée, la modification survit à une panne |
Aller plus loin : les points de sauvegarde
Dans une longue transaction, un SAVEPOINT pose un repère : on peut revenir à ce point sans tout annuler.
BEGIN;
INSERT INTO scelles (objet) VALUES ('Collier');
SAVEPOINT apres_collier;
INSERT INTO scelles (objet) VALUES ('Faux passeport');
ROLLBACK TO apres_collier; -- le passeport est annulé, le collier est gardé
COMMIT;