Passer au contenu principal
eLearner.app
Module 8 · Leçon 4 sur 432/57 dans le cours~10 min
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

SQL
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 fosse

Tout 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.

SQL
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

SQL
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 :

SQL
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 confermato

ACIDE 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 COMMIT réussi n'est pas perdu même en cas de crash.

A ton tour

Exercice#sql.m8.l4.e1
Tentatives : 0Chargement…

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.

Chargement de l'éditeur…
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

Exercice#sql.m8.l4.e2
Tentatives : 0Chargement…

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 »).

Chargement de l'éditeur…
Afficher l'indice

ROLLBACK annule chaque modification effectuée à partir de BEGIN.

Solution disponible après 3 tentatives