RailsアプリケーションのモデルがActiveRecord::StatementInvalidをスローし始め、次のメッセージが表示されます:「Mysql :: Error:ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再開してみてください...」これを最初に処理した方法は、次のとおりです。
myModel.update/save/update_all
次のような例外をキャッチするためにラップします。
begin
myModel.update_all(..)
rescue Exception => e
if e.message.include?("Deadlock")
retry
end
end
これに伴う問題は、更新/保存があるすべての場所でこの例外を救済する必要があることと、再試行によって2回実行されるか、さらに悪いことに無限ループに陥ることに注意する必要があることです。たとえば、コールバックのように、モデルレベルの1つの場所でこの問題に対処する方法はありますか?この時点ではまだ例外がスローされていないため、after_saveまたはafter_updateではうまくいかないようです。私はRails2.3.8を使用しているので、after_commitまたはafter_rollbackはオプションではありません。何か案は?ありがとう!ps:mysqlがデッドロックを起こす可能性を回避または減らす方法があることは知っていますが、私の場合はデッドロックがあまり頻繁に発生しないため、デッドロックが発生した後にトランザクションを再開するだけで問題ありません。