で期待通りに動作しないロック:データベースは、私は、レールモデルに次のコードを持っているレール&Postgresの
foo = Food.find(...)
foo.with_lock do
if bar = foo.bars.find_by_stuff(stuff)
# do something with bar
else
bar = foo.bars.create!
# do something with bar
end
end
目標が作成されているタイプのバーが二度作成されていないことを確認することです。
コンソールでwith_lockが動作することは、私の期待を裏付けるものです。しかし、プロダクションでは、ロックの一部または全部が期待どおりに動作しておらず、冗長バーが試行されているように見えるため、with_lockは(常に)コードのターンを待たない。
ここで何が起こっている可能性がありますか?
更新 "ロックfooはあなたを助けません"と言っていた人に申し訳ありません!私の例では最初にバーのルックアップがありませんでした。これは今修正されました。
バーは既に存在していますか? –
@FrederickCheung:どうしてあなたは点検してもらえませんか?データベース外のチェックには常に**ホールと競争条件があります。 –
私は個人的にはそうではありませんが、理解のどの部分に欠陥があるかをOPが理解するのに役立つかもしれません。 –