【问题标题】:ActiveRecord3 deadlock retryActiveRecord3 死锁重试
【发布时间】:2011-04-30 23:17:49
【问题描述】:

是否有任何适用于 Rails 3(或 ActiveRecord 3)的插件可以复制旧的 deadlock_retry 插件?或者,该插件是否仍然适用于 Rails 3?

【问题讨论】:

    标签: mysql ruby-on-rails-3 deadlock


    【解决方案1】:

    我什至不知道有一个插件可以做到这一点:)

    这是我们使用的(但您必须自己在其中包装容易死锁的查询):

    # Executes the given block +retries+ times (or forever, if explicitly given nil),
    # catching and retrying SQL Deadlock errors.
    def retry_lock_error(retries = 100, &block)
      begin
        yield
      rescue ActiveRecord::StatementInvalid => e
        if e.message =~ /Deadlock found when trying to get lock/ and (retries.nil? || retries > 0)
          retry_lock_error(retries ? retries - 1 : nil, &block)
        else
          raise e
        end
      end
    end
    

    【讨论】:

    • 这让我头疼不已。谢谢。
    【解决方案2】:

    有一个transaction_retry gem 不仅适用于 Rails 3+,而且支持所有主要数据库(MySQL、PostgreSQL 和 SQLite)。它以干净且经过良好测试的方式销售。

    【讨论】:

    • 嗯,最后一次提交是 2018 年 6 月,但在此之前是 2013 年 6 月。一个 5 年的窗口,没有对 gem 做任何事情。我很怀疑。很想听听是否有人在 Rails 4+ 中稳定地工作。
    • 我们现在正在我们的 Rails 4.2.11 应用程序上试用它,它似乎工作得很好。它完全解决了我们在密集的并发导入期间看到的死锁问题,据我们所知,它似乎没有引起任何其他问题。
    【解决方案3】:

    rails / deadlock_retry

    "死锁重试允许数据库适配器(目前只用 MySQLAdapter) 重试陷入死锁的事务。它将重试 这样的交易三次才最终失败。

    此功能会自动添加到 ActiveRecord。无需更改代码或其他方式。”

    【讨论】:

    • re “此功能会自动添加到 ActiveRecord” - 试图找到确认这一点的来源,google-fu 让我失望了。你能指出我在 AR 核心中对此的描述吗?
    • 我想你可能误会了——海报引用的 gem (rails / deadlock_retry) 会自动将其添加到活动记录中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多