Transactions SQL : quand et pourquoi les utiliser ?

asked a month ago618 viewsfr

7

Dans mon app de transfert d'argent entre comptes, je fais deux UPDATE (débit puis crédit). Un collègue dit qu'il faut une transaction. Pourquoi ?

AI diagnosis

AI-generated. Not an answer — the community below confirms or corrects it. Always verify before relying on it.

1 Answer

9
✓
✓ Accepted answer

Sans transaction, si le serveur plante entre le débit et le crédit, l'argent disparaît. Une transaction garantit que les opérations réussissent toutes ou aucune (atomicité, le « A » d'ACID) :

BEGIN;
UPDATE comptes SET solde = solde - 500 WHERE id = 1 AND solde >= 500;
-- vérifier qu'une ligne a bien été modifiée, sinon ROLLBACK
UPDATE comptes SET solde = solde + 500 WHERE id = 2;
COMMIT;

Points importants pour un cas financier : - La condition AND solde >= 500 dans l'UPDATE évite un solde négatif même avec des requêtes concurrentes. La ligne est verrouillée pendant la mise à jour. - Verrouille toujours les comptes dans le même ordre (par id croissant) pour éviter les interblocages (*deadlocks*). - Enregistre chaque mouvement dans une table mouvements (grand livre) en plus du solde, pour pouvoir auditer.

Avec Prisma : prisma.$transaction(async (tx) => { ... }).

Sign in to tell others whether this worked.

answered a month ago

Sign in and verify your email to post an answer.