40P01: deadlock_detected
PostgreSQLЧто это значит?
Две или более транзакции оказались во взаимоблокировке, каждая ждёт блокировки, удерживаемые другой. PostgreSQL обнаруживает цикл и отменяет одну из транзакций.
Почему возникает?
Захват блокировок в разном порядке, перекрёстные обновления одних и тех же строк, длительные транзакции или конфликтующие блокировки, захватываемые при проверках внешних ключей.
Как исправить
Детали взаимоблокировки в журнале сервера показывают конфликтующие запросы. Во всех транзакциях обращайтесь к таблицам/строкам в одном и том же порядке. Делайте транзакции короткими. Перехватывайте отменённую транзакцию в приложении и повторяйте её. Для изучения блокировок соедините pg_locks с pg_stat_activity. При необходимости задайте порядок блокировок явно с помощью SELECT ... FOR UPDATE.