Kodokon kodokon.com

Transactions : BEGIN, COMMIT, ROLLBACK et ACID

Rendez vos écritures atomiques avec les transactions et comprenez ce que les garanties ACID impliquent au quotidien.

8 min · 3 questions

Ouvrir cette leçon dans Kodokon

Un virement bancaire, c'est deux UPDATE : débiter un compte, créditer l'autre. Si le second échoue, la base ment. La transaction rend le bloc indivisible, avec les garanties ACID : Atomicité (tout ou rien), Cohérence (les contraintes restent vraies), Isolation (les transactions concurrentes ne se voient pas à moitié faites), Durabilité (un COMMIT survit à un crash). Pour cette leçon, préférez le vrai client sqlite3 : certains bacs à sable web valident chaque requête automatiquement.

SQL
CREATE TABLE accounts (
  id INTEGER PRIMARY KEY,
  owner TEXT NOT NULL,
  balance REAL NOT NULL CHECK (balance >= 0)
);

INSERT INTO accounts (owner, balance)
VALUES
  ('alice', 500.0),
  ('bruno', 120.0);
La contrainte CHECK interdit tout solde négatif.

Le cas nominal : BEGIN ouvre la transaction, les écritures s'accumulent, COMMIT les rend définitives d'un bloc. Entre les deux, aucune autre connexion ne voit l'état intermédiaire (alice débitée, bruno pas encore crédité).

SQL
BEGIN;

UPDATE accounts
SET balance = balance - 200
WHERE owner = 'alice';

UPDATE accounts
SET balance = balance + 200
WHERE owner = 'bruno';

COMMIT;

SELECT owner, balance FROM accounts;
Virement atomique : 300 pour alice, 320 pour bruno.

Le cas d'échec, maintenant. Débiter bruno de 400 violerait CHECK (balance >= 0) : la requête échoue. Subtilité SQLite : par défaut, une erreur annule la requête fautive mais laisse la transaction ouverte. C'est à votre code applicatif de décider : ROLLBACK pour tout annuler (le réflexe sain), ou continuer si l'erreur est récupérable.

SQL
BEGIN;

UPDATE accounts
SET balance = balance - 400
WHERE owner = 'bruno';
-- Erreur : CHECK (balance >= 0) rejette la ligne.

ROLLBACK;

SELECT owner, balance FROM accounts;
Après ROLLBACK, les soldes du dernier COMMIT sont intacts.

Quiz de validation

Vérifiez que vous avez bien retenu les points clés de cette leçon.

  1. Que garantit l'atomicité, le A de ACID ?
    • Les requêtes de la transaction s'exécutent plus vite
    • La transaction s'applique en entier ou pas du tout
    • Deux transactions ne peuvent jamais lire la même table
  2. Après un ROLLBACK, dans quel état se trouve la base ?
    • Celui du dernier COMMIT, comme si le BEGIN n'avait jamais eu lieu
    • Les UPDATE réussis avant l'erreur sont conservés
    • La base reste verrouillée jusqu'au prochain BEGIN
  3. Pourquoi 10 000 INSERT sont-ils bien plus rapides dans une seule transaction SQLite ?
    • SQLite compresse les données insérées en bloc
    • Une seule synchronisation disque au COMMIT au lieu d'une par requête
    • Les index sont désactivés pendant la transaction