Spec-Zone.ru › MySQL 5.7

14.7.5 Тупики в InnoDB

  • 14.7.5.1 Пример тупика в InnoDB
  • 14.7.5.2 Обнаружение тупиков
  • 14.7.5.3 Минимизация и обработка тупиков

Тупик — это ситуация, в которой несколько транзакций не могут продолжить выполнение, потому что каждая транзакция удерживает блокировку, необходимую другой. Поскольку все задействованные транзакции ожидают освобождения одного и того же ресурса, ни одна из них не освобождает удерживаемую блокировку.

Тупик может возникнуть, когда транзакции блокируют строки в нескольких таблицах (например, с помощью операторов UPDATE или SELECT ... FOR UPDATE), но в обратном порядке. Тупик также может возникнуть, когда такие операторы блокируют диапазоны записей индекса и промежутки, причём каждая транзакция получает некоторые блокировки, но не другие из-за временных проблем. Пример тупика см. в Разделе 14.7.5.1, «Пример тупика в InnoDB».

Для снижения вероятности тупиков используйте транзакции вместо операторов LOCK TABLES; сохраняйте транзакции, выполняющие вставки или обновления данных, достаточно короткими, чтобы они не оставались открытыми длительное время; при обновлении в разных транзакциях нескольких таблиц или больших диапазонов строк используйте одинаковый порядок операций (например, SELECT ... FOR UPDATE) в каждой транзакции; создавайте индексы на столбцах, используемых в операторах SELECT ... FOR UPDATE и UPDATE ... WHERE. Вероятность тупиков не зависит от уровня изоляции, так как уровень изоляции изменяет поведение операций чтения, а тупики возникают из-за операций записи. Более подробную информацию об избежании и восстановлении после условий тупика см. в Разделе 14.7.5.3, «Минимизация и обработка тупиков».

Когда обнаружение тупиков включено (по умолчанию) и тупик всё же происходит, InnoDB обнаруживает это состояние и откатывает одну из транзакций (жертву). Если обнаружение тупиков отключено с помощью переменной innodb_deadlock_detect, то InnoDB полагается на настройку innodb_lock_wait_timeout для отката транзакций в случае тупика. Таким образом, даже если ваша логика приложения корректна, вы должны обработать случай, когда транзакцию необходимо повторить. Чтобы просмотреть последний тупик в транзакции пользователя InnoDB, используйте SHOW ENGINE INNODB STATUS. Если частые тупики указывают на проблему со структурой транзакций или обработкой ошибок приложения, включите innodb_print_all_deadlocks для вывода информации обо всех тупиках в журнал ошибок mysqld. Более подробную информацию о том, как автоматически обнаруживаются и обрабатываются тупики, см. в Разделе 14.7.5.2, «Обнаружение тупиков».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/innodb-deadlocks.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API