Mysql: Lock wait timeout exceeded; try restarting transaction или Конкурентные транзакции в mysql.

Я впервые столкнулся с этой проблемой и поэтому на боевом сервер было принято решение избавиться от блокировки примитивным способом

#service mysql restart

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

В логах было найдена запись Lock wait timeout exceeded; try restarting transaction, что и стало отправной точкой.
[%photo_33%]
Возможно вам будет полезна эта ссылка. Я пришел к выводу что данная проблема возникает когда в запросах используется транзакция и по каким то причинам она не была закончена.


[%photo_34%]

Для того что бы повторить данную проблемы достаточно на таблице с движком InnoDB Начать транзакцию, а в другой консоли попробовать обновить заблокированный ряд

Пути решения проблемы

Запрос:

SHOW ENGINE INNODB STATUS;
покажет текущее состояние дел в системе. Вывод команды достаточно обилен и для сужения мест поиска я воспользовался поиском с помощью консольной утилиты grep
mysql -uroot -e "SHOW ENGINE INNODB STATUS\G" | grep -n2 "ACTIVE"
27:---TRANSACTION 0 2317, ACTIVE  565 sec, process no 1103, OS thread id 139717388965632
28-2 lock struct(s), heap size 368, 1 row lock(s), undo log entries 1
29-MySQL thread id 551, query id 1735 localhost root

Из результата вывода мы видим что транзакция висит уже 565 сек а tread_id запроса 551. Теперь в mysql-console выполняем команду

kill 551;
и дальнейшие наши update идут на ура!

Вам может понравиться