Leçons du module (1/4)
Transactions ACID (BEGIN/COMMIT)
Les fondements de la fiabilité de toute base de données reposent sur l'acronyme ACID :
- Atomicité : une opération se termine entièrement (Commit) ou échoue, ne laissant aucune trace à moitié terminée (Rollback).
- Ccohérence : les règles de la base de données (ex : contraintes, clés étrangères) sont toujours respectées.
- Isolation : les transactions se déroulant en même temps n'interfèrent pas les unes avec les autres de manière incontrôlée.
- Durabilité : après un Commit, la modification est écrite de manière irréversible sur le disque.
Syntaxe des transactions
Normalement, chaque requête UPDATE ou DELETE est traitée comme une transaction autonome (autocommit). Mais lorsque l'on souhaite regrouper plusieurs opérations, par exemple débiter le compte du client et passer la commande, il faut le faire explicitement en utilisant la syntaxe des transactions.
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);
COMMIT; -- Writes the changesSi lors de ces exécutions complexes l'application JavaScript qui a envoyé la requête se rend compte qu'il y a un problème (par exemple il n'y a pas assez de stock dans l'entrepôt et elle plante), elle enverra un :
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the blockEssayez-le vous-même
Ouvrez une transaction. Mettez à jour le produit avec l'ID 10 en définissant sa 'quantité' à 0 dans la table temporaire (pas d'attente, 'quantité' n'est pas sur les produits, inventons : changeons 'unit_price' dans 'order_items' mais cela nécessite une contrainte. Faisons mieux : mettons à jour le statut de l'ID de commande 5 à 'expédié' et réussissons la transaction.
Afficher l'indice
Commencez par BEGIN ;, modifiez les commandes pour id = 5 en status='shipped', puis envoyez-les avec COMMIT ;
Solution disponible après 3 tentatives
Panique en production ! Un développeur a écrit un DELETE sans le WHERE, effaçant historiquement toutes les critiques. Montrons-leur comment la restauration est effectuée. Démarrez une transaction, lancez un DELETE rapide qui efface tout des « avis » (sans clause WHERE), mais utilisez ensuite la bouée de sauvetage SQL pour annuler l'impact avant de terminer le bloc.
Afficher l'indice
BEGIN ;, la suppression de la table rase sur les « avis », puis la magie ROLLBACK ; à la fin.
Solution disponible après 3 tentatives