Повторная попытка блокировки ActiveRecord3

Существуют ли какие-либо плагины для Rails 3 (или ActiveRecord 3), которые реплицируют старый deadlock_retry плагин? Или этот плагин по-прежнему работает с Rails 3?

Ответ 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). Он продается как чистый и хорошо протестированный.

Ответ 3

рельсы /deadlock _retry

"Ошибка повтора тупика позволяет адаптеру базы данных (в настоящее время тестируется только с MySQLAdapter), чтобы повторить транзакции, которые попадают в тупик. Он будет повторять попытку таких транзакций три раза, прежде чем, наконец, не удалось.

Эта возможность автоматически добавляется в ActiveRecord. Никаких изменений кода и не требуется. "