Leçons du module (4/4)
Transactions : tout ou rien
Une transaction est un groupe d'opérations que la base de données traite comme
une seule unité : soit ils réussissent tous, soit aucun d'entre eux ne sort d'un
tracer. C'est ainsi que vous vous protégez des incohérences lorsqu'une séquence
de UPDATE/INSERT/DELETE doivent rester cohérents.
La syntaxe
BEGIN; -- apri la transazione
UPDATE …;
INSERT …;
DELETE …;
SELECT …; -- puoi anche solo leggere
COMMIT; -- conferma tutte le modifiche
-- oppure
ROLLBACK; -- annulla tutte le modifiche, come se nulla fosseTout entre BEGIN et COMMIT est atomique : aucune autre connexion
voit l’état intermédiaire. Si le programme plante ou s'exécute
ROLLBACK, la base de données reste exactement telle qu'elle était avant BEGIN.
Le scénario classique : le transfert
L'exemple canonique est un transfert de stock entre produits (ou un transfert d'argent
virement entre comptes) : deux UPDATE qui doivent réussir ensemble,
jamais un oui et l'autre non.
BEGIN;
UPDATE products SET stock = stock - 1 WHERE id = 1;
UPDATE products SET stock = stock + 1 WHERE id = 2;
COMMIT;Si le deuxième UPDATE échoue (par exemple une erreur de contrainte CHECK), un
ROLLBACK restitue le stock du produit 1 à sa valeur d'origine.
ROLLBACK : le débogueur du DBA
BEGIN;
UPDATE customers SET city = 'X' WHERE id = 1;
SELECT first_name, city FROM customers WHERE id = 1; -- "vedo come è cambiato"
ROLLBACK;Un modèle très utile pour essayer un UPDATE sur des données réelles : vous
exécutez-le, inspectez le résultat avec un SELECT dans la même transaction, et
si cela ne vous convainc pas, vous ROLLBACK — la base de données est exactement la même
c'était avant.
SAVEPOINT : restauration partielle
Au sein d'une transaction, vous pouvez créer des points intermédiaires :
BEGIN;
UPDATE customers SET city = 'A' WHERE id = 1;
SAVEPOINT step1;
UPDATE customers SET city = 'B' WHERE id = 2;
-- mi sono accorto che il secondo UPDATE è sbagliato:
ROLLBACK TO SAVEPOINT step1;
COMMIT; -- solo il primo UPDATE viene confermatoACIDE en 30 secondes
Les transactions garantissent les propriétés ACID :
- Atomicité — tout ou rien ;
- Ccohérence — les contraintes restent satisfaites au début et à la fin de la transaction ;
- Isolation — les transactions simultanées ne voient pas les états intermédiaires (à différents « niveaux » );
- Durabilité — un
COMMITréussi n'est pas perdu même en cas de crash.
A ton tour
En une seule transaction : décrémentez de 1 le stock du produit 1 et incrémentez de 1 le stock du produit 2. Ouvrir avec BEGIN et fermer avec COMMIT.
Afficher l'indice
Stock de référence - 1 et stock + 1 dans les clauses SET respectives.
Solution disponible après 3 tentatives
Exercice de révision
Ouvrez une transaction, essayez de mettre à jour la ville du client avec id=1 à 'Sperimentale', puis annulez l'opération avec ROLLBACK. A la fin, la ville du client 1 doit être celle d'origine (« Milan »).
Afficher l'indice
ROLLBACK annule chaque modification effectuée à partir de BEGIN.
Solution disponible après 3 tentatives