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

1213: Обнаружена взаимоблокировка при попытке получить блокировку; попробуйте перезапустить транзакцию

MySQL

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

InnoDB обнаружил взаимоблокировку, при которой две или более транзакции ждут блокировки друг друга, и разорвал цикл, откатив одну из транзакций.

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

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

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

Просмотрите сведения о последней взаимоблокировке: SHOW ENGINE INNODB STATUS (раздел LATEST DETECTED DEADLOCK). Во всех транзакциях обращайтесь к строкам/таблицам в одном и том же порядке и делайте транзакции короткими. Сузьте блокируемый диапазон, добавив подходящие индексы. Перехватывайте откатанную транзакцию в приложении и повторяйте её (логика повтора).

Открыть в DBAtlas →

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