ruby 2.1.2とレール4.1.4を使用しています。私は私のデータベースの電子メール列にユニークな制約があります。一方のスレッドがユーザーを作成している競合状態があり、他方のスレッドが同時に作成しようとする競合状態がある場合、一意の例外ではないレコードが生成されます。この例外を再試行して処理しようとしていますが、再試行すると、find_or_createでSELECT中に顧客が見つかるようになります。find_or_create ActiveRecord :: RecordNotUniqueレスキューリトライが機能しない
ただし、動作していないようです。再試行がなくなり、例外が再発生します。
は、ここで私はもともと何をやっていたのです。
retries = 10
begin
user = User.find_or_create_by(:email => email)
rescue ActiveRecord::RecordNotUnique
retry unless (retries-=1).zero?
raise
end
私は多分、データベース接続が、それはユーザーがまだ存在しませんし、それを作成しようとし続けることを考えるのが原因SELECTクエリの結果をキャッシュしていたと思いました。私は、クエリキャッシュを無効にするModel.uncachedを使用しようとしたことを修正するには:これも動作していない
retries = 10
begin
User.uncached do
user = User.find_or_create_by(:email => email)
end
rescue ActiveRecord::RecordNotUnique
retry unless (retries-=1).zero?
raise
end
`
。私はこの問題を解決するために何をすべきか分かりません。再試行を増やすべきですか?再試行の間にスリープの遅延を追加しますか?クエリキャッシュをクリアする良い方法はありますか(それが問題なのですか?)
アイデアはありますか?
ありがとうございました!
この問題をどのように再現していますか?本番環境やテストスイートでそれを確認できますか?バックトレースをペーストできますか? – etagwerker