Vous pouvez résoudre ce problème avec l'index suivant :
CREATE INDEX accounts_user_idx ON accounts(user_id);
Puisqu'il y a si peu de données dans votre table d'exemple, vous devrez dire à PostgreSQL d'utiliser un parcours d'index :
SET enable_seqscan=off;
Maintenant, votre exemple fonctionnera !
Si cela ressemble à de la magie noire, jetez un œil aux plans d'exécution des requêtes de votre SELECT
et UPDATE
déclarations.
Sans l'index, les deux utiliseront un parcours séquentiel sur la table, lisant ainsi toutes les lignes de la table . Ainsi, les deux transactions se termineront par un SIReadLock
sur toute la table.
Cela déclenche l'échec de la sérialisation.