MySQL lock wait timeout: найти причину ошибки 1205
Ошибка MySQL 1205 Lock wait timeout exceeded означает, что запрос InnoDB слишком долго ждал блокировку строки. Сначала выясните, какая транзакция удерживает lock, а не увеличивайте глобальный таймаут: это может лишь продлить ожидание и скрыть проблему. Пример подходит для MySQL 8.0 и 8.4 с InnoDB.
Проверить таймаут и ожидающие блокировки
Текущее значение действует в секундах. Список пар «ожидающая транзакция — блокирующая транзакция» доступен через Performance Schema:
SELECT @@SESSION.innodb_lock_wait_timeout AS timeout_seconds;
SELECT
wait_age,
waiting_trx_id,
waiting_pid,
waiting_query,
blocking_trx_id,
blocking_pid,
blocking_query
FROM sys.innodb_lock_waits;Представление sys.innodb_lock_waits может быть недоступно, если sys schema удалена или права ограничены. Сопоставьте PID с приложением и транзакцией; не завершайте блокирующий запрос, пока не выяснили, какие изменения он выполняет.
По умолчанию таймаут InnoDB равен 50 секундам. При его превышении MySQL откатывает текущий оператор, но обычно не всю транзакцию. Приложению следует обработать ошибку, корректно завершить транзакцию и повторять операцию только если она безопасна для повтора. Таймаут относится к ожиданию блокировки строк InnoDB, а не к любому ожиданию блокировки таблицы.
Не меняйте GLOBAL innodb_lock_wait_timeout как быстрый способ устранить ошибку: глобальная настройка влияет на новые сессии сервера. Сессионную настройку применяйте только для обоснованной отдельной операции.
Официальная справка: обнаружение блокирующих транзакций и InnoDB lock wait timeout.