没有明显锁定但出现ActiveRecord的"Mysql::Error: Lock wait timeout exceeded"错误

3

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 显示任何长时间运行的事务吗?这可能会创建未在其他地方显示的隐式锁。 - Marc B
目前没有任何锁结构体存在。在行锁哈希表中的锁结构体总数也是0。 - modulaaron
我正在追踪这个相同的问题。你解决了吗? - kwerle
我也一样。有解决方案吗? - chrishomer
1个回答

4
也许这可以帮助您: http://www.mysqlperformanceblog.com/2007/02/25/pitfalls-of-converting-to-innodb/ 我们经常建议客户将当前的MyISAM表转换为InnoDB。大多数情况下,转换本身几乎是简单的,但应用程序可能会因新的意外错误而出现故障 1205(ER_LOCK_WAIT_TIMEOUT) 锁等待超时。事务已回滚。 1213(ER_LOCK_DEADLOCK) 事务死锁。您应该重新运行事务。
处理这些错误并不难,但您应该知道。以下是我们在PHP应用程序中所做的一些事情:
class mysqlx extends mysqli {

...

  function deadlock_query($query) {
          $MAX_ATTEMPS = 100;
          $current = 0;
          while ($current++ < $MAX_ATTEMPS) {

                  $res = $this->query($query);

                  if(!$res && ( $this->errno== '1205' || $this->errno == '1213'  ) )
                                  continue;
                  else 
                          break;
             }
 } 
...
}

您可能希望以不同的方式处理ER_LOCK_WAIT_TIMEOUT,特别是对于长时间等待不好的Web应用程序,您明白的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接