Aller au contenu
Transactions, index & performance

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

Modèle
BEGIN;  -- instructionsCOMMIT;      -- ou ROLLBACK pour tout annuler

Exemple

Exemple concret
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

  1. 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).
  2. Remplacez COMMIT par ROLLBACK dans l'exemple : la commande 6 n'existe plus, aucune des trois insertions n'a laissé de trace.
  3. Hors BEGIN explicite, chaque instruction est validée seule (mode autocommit). Regrouper 10 000 INSERT dans une transaction les accélère aussi fortement.
  4. 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.
  5. SAVEPOINT nom … ROLLBACK TO nom annule une partie de la transaction sans tout perdre.

Voir aussi