是否有适用于Rails 3 (或ActiveRecord 3)的插件,可以复制旧的deadlock_retry插件?那个插件还适用于Rails 3吗?
我甚至不知道有一个插件可以做到这一点 :)
这是我们使用的方法(但您必须自己将可能导致死锁的查询封装在其中):
# 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
有一个transaction_retry宝石,它不仅适用于Rails 3+,而且支持所有主要数据库(MySQL,PostgreSQL和SQLite)。 它被推销为干净且经过充分测试。
死锁重试允许数据库适配器(目前仅测试过MySQLAdapter)在发生死锁时重试事务。它将在最终失败之前重试此类事务三次。
这种功能已自动添加到ActiveRecord中。不需要进行任何代码更改或其他更改。