DBAtlas · Атлас эксплуатации баз данных

40P01: deadlock_detected

PostgreSQL

Что это значит?

Две или более транзакции оказались во взаимоблокировке, каждая ждёт блокировки, удерживаемые другой. PostgreSQL обнаруживает цикл и отменяет одну из транзакций.

Почему возникает?

Захват блокировок в разном порядке, перекрёстные обновления одних и тех же строк, длительные транзакции или конфликтующие блокировки, захватываемые при проверках внешних ключей.

Как исправить

Детали взаимоблокировки в журнале сервера показывают конфликтующие запросы. Во всех транзакциях обращайтесь к таблицам/строкам в одном и том же порядке. Делайте транзакции короткими. Перехватывайте отменённую транзакцию в приложении и повторяйте её. Для изучения блокировок соедините pg_locks с pg_stat_activity. При необходимости задайте порядок блокировок явно с помощью SELECT ... FOR UPDATE.

Открыть в DBAtlas →

Ещё по этой СУБД