Transactions
Une transaction regroupe plusieurs écritures qui réussissent toutes ou échouent toutes. Une commande et ses lignes, ou un virement entre deux comptes, ne doivent jamais rester à moitié enregistrés.
- BEGIN
- COMMIT
- ROLLBACK
- ACID
- SAVEPOINT
- atomicité
Syntaxe
BEGIN; -- instructionsCOMMIT; -- ou ROLLBACK pour tout annulerExemple
BEGIN;INSERT INTO orders (id, customer_id, order_date, status)VALUES (6, 5, '2024-05-02', 'en cours');INSERT INTO order_items (order_id, product_id, quantity)VALUES (6, 3, 1), (6, 2, 2);COMMIT;SELECT o.id, c.name, COUNT(oi.id) AS nb_lignesFROM orders oJOIN customers c ON c.id = o.customer_idJOIN order_items oi ON oi.order_id = o.idWHERE o.id = 6GROUP BY o.id, c.name;-- Jeu de données : boutique-- La commande et ses deux lignes sont enregistrées ensemble.-- Résultat attendu :-- 6 | Nora Petit | 2À retenir
- ACID : Atomicité (tout ou rien), Cohérence (les contraintes restent vraies), Isolation (les transactions concurrentes ne se voient pas à moitié), Durabilité (un COMMIT survit à une panne).
- Remplacez COMMIT par ROLLBACK dans l'exemple : la commande 6 n'existe plus, aucune des trois insertions n'a laissé de trace.
- Hors BEGIN explicite, chaque instruction est validée seule (mode autocommit). Regrouper 10 000 INSERT dans une transaction les accélère aussi fortement.
- Piège : une transaction oubliée ouverte garde des verrous et bloque les autres écritures. Dans une application, terminez toujours par COMMIT ou ROLLBACK, y compris en cas d'erreur.
- SAVEPOINT nom … ROLLBACK TO nom annule une partie de la transaction sans tout perdre.
Voir aussi
- INSERTINSERT ajoute de nouvelles lignes dans une table, une par une, par lot ou à partir d'une requête. Les colonnes non citées prennent leur valeur par défaut, ou NULL si aucune n'est prévue.
- UPDATEUPDATE modifie les valeurs de lignes existantes. La clause WHERE désigne les lignes visées, SET les nouvelles valeurs, qui peuvent se calculer à partir des anciennes (hausse de prix, statut).
- DELETEDELETE retire des lignes d'une table tout en conservant sa structure. On l'utilise pour purger des données obsolètes ou annulées, toujours avec un WHERE vérifié au préalable.
- RETURNINGRETURNING renvoie les lignes touchées par un INSERT, un UPDATE ou un DELETE, dans la même instruction. On récupère ainsi l'identifiant généré ou les nouvelles valeurs sans requête supplémentaire.