</>
Plan du cours — 30/64

Transactions et ACID

Avancé

Une transaction regroupe plusieurs opérations en une seule unité : tout réussit, ou rien n'est appliqué.

BEGIN;

UPDATE comptes SET solde = solde - 100 WHERE id = 1;
UPDATE comptes SET solde = solde + 100 WHERE id = 2;

COMMIT;      -- ou ROLLBACK; pour tout annuler

ACID#

LettreGarantie
AtomicitéToutes les opérations sont appliquées, ou aucune
CohérenceLes contraintes (clés, CHECK, UNIQUE) sont respectées avant et après
IsolationLes transactions concurrentes n'interfèrent pas (selon le niveau choisi)
DurabilitéUne fois COMMIT confirmé, les données survivent à un crash (journal WAL)

Bon à savoir#

  • Sans BEGIN, chaque instruction est sa propre transaction (autocommit).
  • En PostgreSQL, si une instruction échoue dans une transaction, celle-ci passe à l'état « aborted » : tout est refusé jusqu'à ROLLBACK (ou ROLLBACK TO SAVEPOINT).
  • Même le DDL (CREATE TABLE, ALTER TABLE) est transactionnel : une migration peut être annulée en bloc.

Savepoints#

BEGIN;
INSERT INTO commandes (...) VALUES (...);
SAVEPOINT avant_bonus;
INSERT INTO bonus (...) VALUES (...);      -- suppose qu'il échoue
ROLLBACK TO SAVEPOINT avant_bonus;         -- annule seulement la partie fautive
COMMIT;

Piège : une transaction laissée ouverte (« idle in transaction ») retient des verrous et empêche le nettoyage des anciennes versions de lignes. Réglez idle_in_transaction_session_timeout et gardez les transactions courtes : ne mettez jamais un appel réseau ou une attente utilisateur entre BEGIN et COMMIT.