Rails的版本:2.3.8ActiveRecord的“mysql的::错误:超过了锁定等待超时”,没有明显的锁
很多时候,不论白天,我的申请将看似随机返回一个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
# [email protected]: 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的返回,因为一个错误锁定等待超时。这个简单查询的长期性质似乎也是如此。事情是,无处可查的慢查询日志可以找到需要很长时间处理的实际查询 - 它们都与上面的示例类似。另外,在此相同的日志,没有一个项目有大于0
的Lock_time
值是否有人在这里有一个想法,以什么可能会造成这个明显的锁,以及如何将其隔离?目前我正在使用的工具似乎没有什么帮助。
在此先感谢。
任何通过`show innodb status`显示的长期交易?那些可能会创建隐藏的锁,这些锁并没有出现在别处。 – 2011-01-24 21:41:23