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