17.7.5 Тупики в InnoDB
Тупик — это ситуация, в которой несколько транзакций не могут продолжить свою работу, потому что каждая транзакция удерживает блокировку, необходимую другой. Поскольку все участвующие транзакции ожидают освобождения ресурса, ни одна из них не освобождает удерживаемую блокировку.
Тупик может возникнуть, когда транзакции блокируют строки в нескольких таблицах (через операторы, такие как 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.