【发布时间】:2011-06-14 19:22:32
【问题描述】:
Rails 版本:2.3.8
一天中的很多时候,我的应用程序似乎会随机返回一个 500 错误,并在生产日志中显示相应条目:
ActiveRecord::StatementInvalid (Mysql::Error: Lock wait timeout exceeded; try restarting transaction: INSERT INTO `forum_posts` (`forum_topic_id`, `created_at`, `body`, `ancestry`, `updated_at`, `quote_limit`, `user_id`, `ancestry_depth`, `quote_root`) VALUES(1224783, '2011-01-24 19:18:38', 'Post body', '1285704', '2011-01-24 19:18:38', 1, 57931, 1, 1))
检查 MySQL 慢查询日志显示此条目为:
# Time: 110124 11:19:29
# User@Host: db_user[db_user] @ localhost []
# Query_time: 51 Lock_time: 0 Rows_sent: 0 Rows_examined: 0
SET insert_id=0;
INSERT INTO `forum_posts` (`forum_topic_id`, `created_at`, `body`, `ancestry`, `updated_at`, `quote_limit`, `user_id`, `ancestry_depth`, `quote_root`) VALUES(1224783, '2011-01-24 19:18:38', 'Post body', '1285704', '2011-01-24 19:18:38', 1, 57931, 1, 1);
根据 Rails 日志,ActiveRecord 由于锁定等待超时而返回错误。这个简单查询的长期运行性质似乎也表明了这一点。问题是,慢查询日志无处可寻,我可以找到一个需要很长时间来处理的实际查询——它们都与上面的示例相似。另外,在同一个日志中,没有一个条目的 Lock_time 值大于 0。
这里有没有人知道什么可能导致这种明显的锁定以及如何隔离它?我正在使用的当前工具似乎没有多大帮助。
提前致谢。
【问题讨论】:
-
通过
show innodb status显示的任何长期交易?这些可能会创建隐式锁,而这些锁不会出现在其他地方。 -
目前没有。
Total number of lock structs in row lock hash table也是 0。 -
我正在追查同样的问题。我不认为你解决了它?
-
和我一样。有什么解决办法吗?
标签: mysql ruby-on-rails activerecord locking timeout