mysql - 如何使用 Rails 解决 MySQL 锁定超时错误?

标签 mysql ruby-on-rails locking

突然之间(相关代码没有任何更改)我们通过事件记录遇到锁定错误,例如:

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

我们没有在这两种模型中进行自己的交易,所以唯一的交易是内置的 rails 交易。流量或请求量没有激增。

这些错误似乎是当"new"查询尝试在锁定的表上运行并且必须等待时,我们如何查看它在等待什么?我们如何确定代码的哪一部分发出了长时间锁定表的查询?

关于我们可以在哪里寻找或如何调查其原因的任何想法?

最佳答案

看看 pt-deadlock-logger,虽然它与 rails 没有直接关系,但应该会为您提供大量有关发生的死锁的信息。

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

有一篇很好的文章,其中包含一些示例: http://www.mysqlperformanceblog.com/2012/09/19/logging-deadlocks-errors/

The tool is very simple and useful. It monitors the output of SHOW ENGINE INNODB STATUS and log the new deadlocks to a file or to a table that we can later review. Let’s see how it works with an example.

文章继续解释说,这可以记录有关死锁的信息,例如涉及的查询、哪些主机、线程 ID 等。

我还发现在查询前添加注释很有帮助,以便进行跟踪,例如文件或模块、函数,甚至是哪个用户。查询注释通常会一直传递到像这样的诊断工具,并且可以帮助追踪代码的哪些部分以及在哪些情况下导致死锁。

关于mysql - 如何使用 Rails 解决 MySQL 锁定超时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12439840/

相关文章:

mysql - 消息传递表性能 - 将 id 和 id 合并到一个字段而不是单独的 2 个字段

ruby-on-rails - 如何使用ssh使Heroku上的日志尾部保持事件状态?

ruby-on-rails - 我的 Rails 应用程序只给我一个空白屏幕,根本没有 HTML

Ruby-on-Rails:从模型中选择不同的值

java - AtomicReferenceFieldUpdater疑问

php - 使用 PDO 语句更新 mysql 时遇到问题

php - 通过外键获取 MySQL

php - 如何在查询中选择小时和分钟

c - 删除 GWAN KV 存储结构时如何防止竞争条件?

java - 监视 Java 应用程序上的锁争用