40P01: deadlock_detected
PostgreSQL¿Qué significa?
Dos o más transacciones entraron en deadlock al esperar cada una bloqueos que mantiene la otra. PostgreSQL detecta el ciclo y cancela una de las transacciones.
¿Por qué ocurre?
Bloqueos adquiridos en distinto orden, actualizaciones cruzadas de las mismas filas, transacciones largas o bloqueos en conflicto tomados durante las comprobaciones de claves foráneas.
Cómo solucionarlo
El detalle del deadlock en el log del servidor muestra las consultas en conflicto. Acceda a tablas/filas en el mismo orden en todas las transacciones. Mantenga las transacciones cortas. Capture la transacción cancelada en la aplicación y reinténtela. Combine pg_locks con pg_stat_activity para examinar los bloqueos. Si es necesario, haga explícito el orden de bloqueo con SELECT ... FOR UPDATE.