Подтвердить что ты не робот

Как устранить ошибки времени ожидания блокировки MySQL с помощью Rails?

Внезапно (без каких-либо изменений в связанном коде) мы получаем ошибки блокировки посредством активной записи, например:

ActiveRecord::StatementInvalid: Mysql2::Error: Lock wait timeout exceeded; 
try restarting transaction: UPDATE `items` SET `state` = 'reserved', `updated_at` = '2012-09-15 17:58:21' WHERE `items`.`id` = 248220

и

ActiveRecord::StatementInvalid: Mysql2::Error: Lock wait timeout exceeded; 
try restarting transaction: DELETE FROM `sessions` WHERE `sessions`.`id` = 41997883

Мы не делаем собственных транзакций в любой из этих моделей, поэтому единственными транзакциями являются встроенные в рельсы. Не было увеличения объема трафика или объема запросов.

Эти ошибки появляются, когда "новый" запрос пытается работать в заблокированной таблице и должен ждать, как мы видим, чего он ждет? Как мы выясним, какая часть нашего кода выдает запросы, которые блокируют таблицы в течение длительных периодов времени?

Любые идеи о том, где мы можем смотреть или как исследовать причину этого?

4b9b3361

Ответ 1

Взгляните на pt-deadlock-logger, не имея прямого отношения к рельсам, должен предоставить вам значительный объем информации о тупиках.

http://www.percona.com/doc/percona-toolkit/2.1/pt-deadlock-logger.html

Есть хорошая запись с примерами: http://www.mysqlperformanceblog.com/2012/09/19/logging-deadlocks-errors/

Инструмент очень прост и полезен. Он контролирует вывод SHOW ENGINE INNODB STATUS и записывает новые взаимоблокировки в файл или в таблицу, которую мы можем позже просмотреть. Давайте посмотрим, как это работает с примером.

В статье далее объясняется, что это может записывать информацию о тупике, например о запросах, о том, какие хосты, идентификаторы потоков и т.д.

Я также счел полезным префиксные запросы с комментариями, чтобы отслеживать, например, файл или модуль, функцию, даже тот пользователь. Обычно запросы запроса передаются вплоть до диагностических инструментов, подобных этому, и могут помочь отслеживать, какие части кода и в каких обстоятельствах вызывают взаимоблокировки.