Существуют ли какие-либо плагины для Rails 3 (или ActiveRecord 3), которые реплицируют старый deadlock_retry плагин? Или этот плагин по-прежнему работает с Rails 3?
Повторная попытка блокировки ActiveRecord3
Ответ 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
"Ошибка повтора тупика позволяет адаптеру базы данных (в настоящее время тестируется только с MySQLAdapter), чтобы повторить транзакции, которые попадают в тупик. Он будет повторять попытку таких транзакций три раза, прежде чем, наконец, не удалось.
Эта возможность автоматически добавляется в ActiveRecord. Никаких изменений кода и не требуется. "