ActiveRecord3 повторная попытка блокировки - PullRequest
12 голосов
/ 27 октября 2010

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

Ответы [ 3 ]

10 голосов
/ 15 сентября 2011

Я даже не знал, что для этого есть плагин:)

Вот то, что мы используем (но вы должны сами обернуть склонные к тупику запросы):

# 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
8 голосов
/ 03 марта 2012

Существует гем action_retry , который не только работает с Rails 3+, но поддерживает все основные базы данных (MySQL, PostgreSQL и SQLite). Он продается как чистый и хорошо протестированный.

2 голосов
/ 27 декабря 2012

rails / deadlock_retry

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

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

...