mysql - 没有明显锁的 ActiveRecord "Mysql::Error: Lock wait timeout exceeded"

标签 mysql ruby-on-rails activerecord locking timeout

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。

这里有没有人知道是什么导致了这种明显的锁定以及如何隔离它?我目前使用的工具似乎没有太大帮助。

提前致谢。

最佳答案

也许这有帮助: 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 应用程序,您明白了。

关于mysql - 没有明显锁的 ActiveRecord "Mysql::Error: Lock wait timeout exceeded",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4787244/

相关文章:

php - 将多个 foreach MySQL 插入语句与 PHP 数组数据合并为一个

mysql - 为什么我的存储过程返回 null 以及所需的数据

ruby-on-rails - 使用rails迁移生成器添加外键

activerecord - 表少模型协会

ruby-on-rails - 计算月份统计

php - 在 codeigniter 中调用 Controller 函数

php - SQL 外键用法?它到底有什么作用?什么时候需要?

ruby-on-rails - 为什么 Rails 中的强参数顺序很重要?

ruby-on-rails - 在 FactoryGirl 中创建 HABTM 关系?

ruby-on-rails - 我应该在 HABTM 表中包含其他字段吗?