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#
| Lettre | Garantie |
|---|---|
| Atomicité | Toutes les opérations sont appliquées, ou aucune |
| Cohérence | Les contraintes (clés, CHECK, UNIQUE) sont respectées avant et après |
| Isolation | Les 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(ouROLLBACK 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_timeoutet gardez les transactions courtes : ne mettez jamais un appel réseau ou une attente utilisateur entreBEGINetCOMMIT.