【问题标题】:ActiveRecord::StatementInvalid: Mysql2::Error: Lock wait timeout exceededActiveRecord::StatementInvalid: Mysql2::Error: Lock wait timeout exceeded
【发布时间】:2016-09-13 05:18:01
【问题描述】:

在我的rails项目中,我使用sidekiq处理耗时任务,但在sidekiq中记录错误:

ActiveRecord::StatementInvalid: Mysql2::Error: Lock wait timeout exceeded; try restarting transaction: UPDATE `marker_layers` SET `show_fields` = 'title,desc', `sort_col` = 'title,desc', `updated_at` = '2016-05-17 07:36:02' WHERE `marker_layers`.`id` = 16021210
Processor: iZ23edse84Z:29310

sidekiq.yml

# Options here can still be overridden by cmd line args.
#   setsid sidekiq -d -C config/sidekiq.yml -e production
---
:concurrency: 5
:pidfile: tmp/pids/sidekiq.pid
:logfile: log/sidekiq.log
staging:
  :concurrency: 10
production:
  :concurrency: 40
:queues:
  - ['critical', 3]
  - ['default', 2]
  - ['low', 1]

database.yml

production:
   adapter: mysql2
   encoding: utf8mb4
   collation: utf8mb4_bin
   reconnect: false
   database: database_name
   pool: 48
   username: password
   password: password
   host: locahost

【问题讨论】:

  • 很可能有多个工作人员尝试更新同一数据库行,并在等待访问时超时。根据您的信息,我们无法提供更多信息。您可能应该重新检查您的代码以了解竞争条件并查看死锁来自何处......
  • 您可能会发现stackoverflow.com/questions/6000336/… 有帮助
  • 您可能还想了解innodb_lock_wait_timeoutinnodb_deadlock_detect 变量

标签: mysql ruby-on-rails activerecord sidekiq


【解决方案1】:

发生此错误是因为不同工作人员尝试修改同一资源时事务超时,基本上是数据库死锁。

如果您使用像 SomeModel.transaction { SomeModel.task_that_takes_too_much_time } 这样的事务,或者使用修改记录的普通 ActiveRecord 方法,因为所有内容都被包装到事务中,就会发生这种情况。

我能给你的唯一建议是探索使你的员工独特的替代方法,例如使用 https://github.com/mhenrixon/sidekiq-unique-jobs 并让你的工作使用 .perform_in

【讨论】:

    【解决方案2】:

    表示操作中的记录被另一个慢SQL锁住了,等待了很长时间。

    也许你的代码中有很多长事务。

    检查您的代码,优化慢速 SQL 并拆分长事务。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      当数据库大小增加并且您明确地执行大量事务时会发生这种情况,可能其他线程对某条记录持有记录锁的时间过长,而您的线程正在超时。

      我使用的一个解决方案是延长等待超时。

      通过终端登录 MySQL 并运行。

      SET GLOBAL innodb_lock_wait_timeout = 28800;
      

      您可以做的另一件事是强制解锁 MySQL 中的锁定表:

      像这样打破锁通常会导致数据库中的原子性无法对导致锁的 sql 语句强制执行。

      这是一个黑客。正确的解决方案是修复导致锁定的应用程序。

      FORCE UNLOCK for locked tables in MySQL:

      【讨论】:

        猜你喜欢
        • 2011-06-14
        • 2018-08-30
        • 2015-10-29
        • 2018-03-15
        • 1970-01-01
        • 2018-08-05
        • 2014-07-10
        • 1970-01-01
        • 2015-12-26
        相关资源
        最近更新 更多