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.