Railsモデルに次のコードがあります:
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
目標は、作成されるタイプのバーが 2 回作成されないようにすることです。
コンソールでの with_lock の動作のテストは、私の予想を裏付けています。ただし、本番環境では、一部またはすべてのケースでロックが期待どおりに機能せず、冗長な Bar が試行されているようです。そのため、with_lock は (常に?) コードが順番を待つことにはなりません。 .
ここで何が起こっているのでしょうか?
「 foo をロックしても役に立たない」と言っていた皆さん、ごめんなさい!! 私の例には、最初はバールックアップがありませんでした。これは修正されました。