ActiveRecord3死锁重试

时间:2010-10-26 20:23:17

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

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

3 个答案:

答案 0 :(得分:10)

我甚至不知道有一个插件可以执行此操作:)

这是我们使用的(但你必须在其中包含易受死锁的查询):

# 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

答案 1 :(得分:8)

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

答案 2 :(得分:2)

rails / deadlock_retry

“死锁重试允许数据库适配器(目前仅使用 MySQLAdapter)重试陷入死锁的事务。它会重试 这样的交易在最终失败之前三次。

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