2010-10-26 131 views

回答

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

这只是让我头痛。谢谢。 – 2012-10-03 02:50:04

6

有是一个transaction_retry gem,它不仅能够与Rails 3+一起工作,而且还支持所有主要数据库(MySQL,PostgreSQL和SQLite)。它被销售为干净且经过充分测试的产品。

2

rails/deadlock_retry

“死锁重试允许数据库适配器(目前只适用于 MySQLAdapter测试)重试落入僵局的交易,这将重试 这样的交易最终失败之前的三倍。

这功能会自动添加到ActiveRecord中,不需要更改代码或其他方式。“

+0

re“这个功能会自动添加到ActiveRecord中” - 试图找到确认这一点的源代码,google-fu让我失望。你能指出我在AR核心中对此的描述吗? – 2014-05-14 22:25:09

+0

我也许稀释了你的误解---海报引用的(rails/deadlock_retry)自动将这个添加到活动记录 – 2015-07-21 20:22:42