views_count
、males_views_count
およびfemales_views_count
フィールドを持つコレクションがあるとしましょう。$inc
ページが表示されたときに、カウント フィールドをそれぞれ (インクリメント)できるようにしたいと考えています。
これに関する問題は、複数の同時接続を受け取り、競合状態が発生する可能性があることです。
Mongodb のアトミック操作について読んでいます。彼らは通常、成功または失敗のアプローチを持っています。レコードが書き込まれているか、書き込まれていないかのどちらかです。つまり、操作が失敗したかどうかを判断し、失敗した場合は再試行するロジックを作成する必要があるということですか?
私のシナリオに戻ります。(競合状態が発生した場合でも) すべてのビューをカウントしたい場合はどうすればよいでしょうか。Mongodb ロックが従来の RDBMS とは少し異なることは知っています。通常、楽観的ロック手法を実装します。に似ている:
begin
# .. do work .. determine if user is a male or a female
stat.save
rescue StaleDocumentError
stat.reload
retry
end
それとも、アトミック操作は、更新を行うのはサーバーであり、真実が何であるかについて信頼できるサーバーであるため、競合状態を防ぐためのものですか? もしそうなら、楽観的/悲観的ロック技術を実装する必要はありますか?それともアトミック操作を使用する場合、Mongodb はそれを処理してくれますか?