sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Por qué la transacción serializable de PostgreSQL piensa que esto es un conflicto?

Puede solucionar este problema con el siguiente índice:

CREATE INDEX accounts_user_idx ON accounts(user_id);

Dado que hay tan pocos datos en su tabla de ejemplo, tendrá que decirle a PostgreSQL que use un escaneo de índice:

SET enable_seqscan=off;

¡Ahora tu ejemplo funcionará!

Si eso parece magia negra, eche un vistazo a los planes de ejecución de consultas de su SELECT y UPDATE declaraciones.

Sin el índice, ambos usarán un escaneo secuencial en la tabla, leyendo así todas las filas de la tabla . Entonces ambas transacciones terminarán con un SIReadLock en toda la mesa.

Esto desencadena el error de serialización.