MySQL и MariaDB LinuxWindowsmacOS 1213

MySQL: ERROR 1213 — Deadlock found when trying to get lock

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

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

Взаимная блокировка транзакций. Повторите транзакцию, обновляйте строки в едином порядке и сокращайте время удержания.

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

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

1213
Deadlock found

Взаимная блокировка транзакций. Повторите транзакцию, обновляйте строки в едином порядке и сокращайте время удержания.

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

Возможная причинаКак узнатьЧто делать
Разный порядокВ случае «MySQL: ERROR 1213 — Deadlock found when trying to get lock» проверьте наличие причины «Разный порядок» по исходному действию и связанному сообщению; переходить к исправлению стоит после её подтверждения.Упорядочите
Долгие транзакцииВ случае «MySQL: ERROR 1213 — Deadlock found when trying to get lock» проверьте наличие причины «Долгие транзакции» по исходному действию и связанному сообщению; переходить к исправлению стоит после её подтверждения.Сократите. Конкретное действие зависит от проверки причины «Долгие транзакции», описанной в пошаговой инструкции.
Нет индексаВ случае «MySQL: ERROR 1213 — Deadlock found when trying to get lock» проверьте наличие причины «Нет индекса» по исходному действию и связанному сообщению; переходить к исправлению стоит после её подтверждения.Добавьте. Конкретное действие зависит от проверки причины «Нет индекса», описанной в пошаговой инструкции.
Нет повтораВ случае «MySQL: ERROR 1213 — Deadlock found when trying to get lock» проверьте наличие причины «Нет повтора» по исходному действию и связанному сообщению; переходить к исправлению стоит после её подтверждения.Повторяйте

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

  1. Определите причинуВ журнале MySQL или приложения найдите ERROR 1213 Deadlock found when trying to get lock; на сервере с правами администратора выполните SHOW ENGINE INNODB STATUS\G в MySQL CLI и найдите раздел LATEST DETECTED DEADLOCK. Сохраните запросы, таблицы и порядок блокировок без публикации конфиденциальных данных.
  2. Выполните подходящее исправлениеСравните порядок изменения таблиц в двух конфликтующих транзакциях. На стенде добейтесь одинакового порядка получения блокировок и сократите время между началом транзакции и COMMIT. Добавьте нужные индексы после проверки EXPLAIN, чтобы транзакции не захватывали больше строк, чем необходимо.
  3. Проверьте другие возможные причиныЕсли число взаимных блокировок невелико и приложение поддерживает безопасный повтор, реализуйте ограниченный повтор всей транзакции после 1213 с небольшой случайной задержкой. Это допустимо только для идемпотентного сценария с корректным откатом; не повторяйте внешние платежи или отправку сообщений без проверки факта выполнения.
  4. Убедитесь в результатеВыполните тест конкурирующих запросов на копии данных, убедитесь в отсутствии потерянных обновлений и неправильного порядка операций. Отдельно наблюдайте количество 1213 после развёртывания; полностью исключить взаимные блокировки в конкурентных БД не всегда возможно, но приложение должно их обрабатывать.

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

Если «MySQL: ERROR 1213 — Deadlock found when trying to get lock» повторяется, сохраните время, состояние подключения и точный текст ошибки. Не меняйте сразу несколько настроек — иначе станет трудно понять, какое действие повлияло на результат.

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

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

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