PostgreSQL LinuxWindowsmacOS

PostgreSQL: ERROR: deadlock detected

  • Обновлено
  • Чтение ≈ 2 минуты

Краткий ответ

Две транзакции ждут друг друга. Обновляйте строки в одном порядке, укорачивайте транзакции и повторяйте при ошибке.

В этой статье
  1. Что означает ошибка
  2. Причины и признаки
  3. Пошаговое решение
  4. Если проблема осталась

#Что означает ошибка

Сообщение
deadlock detected

Две транзакции ждут друг друга. Обновляйте строки в одном порядке, укорачивайте транзакции и повторяйте при ошибке.

#Причины и признаки

Возможная причинаКак узнатьЧто делать
Разный порядок блокировокТранзакции захватывают строки в разном порядке.Унифицируйте порядок обновлений.
Долгие транзакцииТранзакции остаются открытыми надолго.Сократите транзакции, не делайте внешние вызовы внутри.
Нет индексаМассовые операции удерживают много строк.Оптимизируйте запросы и блокировки по плану.
Нет повтораПриложение не обрабатывает SQLSTATE 40P01.Повторяйте всю отменённую транзакцию ограниченно.

#Пошаговое решение

  1. Найдите участников взаимной блокировкиdeadlock detected — это цикл ожиданий между транзакциями; PostgreSQL прерывает одну из них для разрыва цикла. Администратор найдёт в журнале PostgreSQL запись ERROR с именами процессов, запросами и объектами. Сохраните её вместе со временем возникновения; обычное ожидание блокировки — другая ошибка.
  2. Проверьте порядок операций в приложенииСравните транзакции, которые меняют одни и те же строки/таблицы. Если первая обновляет A→B, а вторая B→A, приведите порядок к одному и тому же в коде. Сократите длительность транзакций: запросы к сети и ожидание действий пользователя не должны выполняться с открытой блокировкой.
  3. Добавьте повтор только отменённой транзакцииОбработчик PostgreSQL SQLSTATE 40P01 должен отменить текущую транзакцию и может повторить всю логическую операцию ограниченное число раз после небольшой случайной задержки. Повтор должен быть безопасным для побочных эффектов и использовать новый транзакционный контекст. Простое увеличение lock_timeout не устраняет цикл.
  4. Проверьте результат на нагрузочном сценарииНа тестовой базе воспроизведите параллельные операции и убедитесь, что конфликт либо исчезает, либо корректно обрабатывается с повтором. Не завершайте все соединения PostgreSQL и не отключайте проверку транзакций на рабочей базе. При повторении сохраните схемы запросов и журнал deadlock.

#Если проблема осталась

Если «PostgreSQL: ERROR: deadlock detected» повторяется, сохраните время, состояние подключения и точный текст ошибки. Не меняйте сразу несколько настроек — иначе станет трудно понять, какое действие повлияло на результат.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.