40P01: deadlock_detected
PostgreSQLO que significa?
Duas ou mais transações entraram em deadlock, cada uma aguardando locks mantidos pela outra. O PostgreSQL detecta o ciclo e cancela uma das transações.
Por que acontece?
Locks adquiridos em ordens diferentes, atualizações cruzadas das mesmas linhas, transações longas, ou locks conflitantes obtidos durante verificações de foreign key.
Como resolver
O detalhe do deadlock no log do servidor mostra as consultas em conflito. Acesse tabelas/linhas na mesma ordem em todas as transações. Mantenha as transações curtas. Capture a transação cancelada na aplicação e tente novamente. Faça join de pg_locks com pg_stat_activity para examinar os locks. Se necessário, torne a ordem dos locks explícita com SELECT ... FOR UPDATE.