PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Pourquoi la transaction sérialisable PostgreSQL considère-t-elle cela comme un conflit ?

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.