mysql Превышено время ожидания блокировки; попробуйте перезапустить транзакцию

26

мы работаем с Java-приложением, работаем целую вечность, back end - это MySQL, недавно обновленный до mysql 5.6. Все работало нормально, на прошлой неделе началось сообщение об ошибке Превышено время ожидания блокировки; попробуйте перезапустить транзакцию, которая выглядит так, как будто никогда не прекращается, не знаю, что делать с этой ошибкой для остановки. почему это происходит внезапно

JAVAC
источник

Ответы:

29

Вы можете установить переменную innodb_lock_wait_timeout = 100 для времени блокировки до 100 сек.

mysql> set innodb_lock_wait_timeout=100;

Query OK, 0 rows affected (0.02 sec)

mysql> show variables like 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 100   |
+--------------------------+-------+

Транзакция, для которой истекло время ожидания, попытайтесь заблокировать таблицу, которая удерживается другим процессом. и ваша переменная таймаута установлена ​​с небольшим количеством секунд. так что показывает ошибку. Вы можете увидеть больше статуса с помощью команды.

SHOW ENGINE INNODB STATUS\G 

Вы можете увидеть список заблокированных таблиц

 show open tables where in_use>0;

Теперь посмотрите поток, который использует эту таблицу

  show full processlist;

Теперь вы можете убить этот поток или подождать, пока он не завершится.

Хитеш Мундра
источник
Спасибо за эту информацию, но как найти причину проблемы, когда блокировки продолжают происходить, даже для очень простых таблиц с небольшими обновлениями (такими как увеличение или обновление одного поля).
Воутер
-1

Если вы используете версию MySQL менее 5.0, вы не сможете изменить переменную даже для сеанса или глобальной области видимости. Лучшее решение - захватить запрос и выполнить его после медленного трафика.

Sherry_MySQL
источник
2
ОП говорит, что они используют 5,6, что (я полагаю) 5,0 или выше.
RDFozz