Spec-Zone.ru › MySQL 9.2

17.7.5 Тупики в InnoDB

  • 17.7.5.1 Пример тупика в InnoDB
  • 17.7.5.2 Обнаружение тупиков
  • 17.7.5.3 Минимизация и обработка тупиков

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

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

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

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

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

Spec-Zone.ru

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