Retour à la leçonMission
Mission : de l'argent disparaît lors d'un transfert entre comptes
Corriger une opération de transfert non atomique et une injection SQL, puis résoudre un épuisement de pool de connexions causé par un release() manquant.
Contexte
La route POST /accounts/:id/transfer exécute deux requêtes séparées : pool.query('UPDATE accounts SET balance = balance - $1 WHERE id = $2', [amount, fromId]) puis, dans un bloc séparé, la même chose pour créditer toId. Un incident en production montre que lors d'un pic de charge, le débit réussit parfois sans que le crédit ne s'exécute (le serveur redémarre entre les deux requêtes), et de l'argent disparaît. Une autre route de recherche construit sa requête avec pool.query('SELECT * FROM users WHERE email = \'' + req.query.email + '\'').