【发布时间】:2011-04-30 23:17:49
【问题描述】:
是否有任何适用于 Rails 3(或 ActiveRecord 3)的插件可以复制旧的 deadlock_retry 插件?或者,该插件是否仍然适用于 Rails 3?
【问题讨论】:
标签: mysql ruby-on-rails-3 deadlock
是否有任何适用于 Rails 3(或 ActiveRecord 3)的插件可以复制旧的 deadlock_retry 插件?或者,该插件是否仍然适用于 Rails 3?
【问题讨论】:
标签: mysql ruby-on-rails-3 deadlock
我什至不知道有一个插件可以做到这一点:)
这是我们使用的(但您必须自己在其中包装容易死锁的查询):
# 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 gem 不仅适用于 Rails 3+,而且支持所有主要数据库(MySQL、PostgreSQL 和 SQLite)。它以干净且经过良好测试的方式销售。
【讨论】:
"死锁重试允许数据库适配器(目前只用 MySQLAdapter) 重试陷入死锁的事务。它将重试 这样的交易三次才最终失败。
此功能会自动添加到 ActiveRecord。无需更改代码或其他方式。”
【讨论】: