2011-07-29 5 views
0

私はMongoを使い始めています。私は疑問に思っています:Mongoの競争条件を処理する最良の方法は何ですか?モンゴの人種条件と最も効率的なパターン?

たとえば、バージョン1のフィールドを持つドキュメントをユーザーAがバージョン2に更新すると、ユーザーBがバージョン1(ユーザーBが受け取ったバージョン)から更新しようとすると、レコードが更新されたことをユーザーBに通知します。

解決策の1つは、照会の基準としてバージョンフィールドを使用することです。これは、findAndModifyです。例えば

は:

db.things.findAndModify({query: { version: "1"}, update: { $set: {Title: "New Title"}}}) 

しかし、ここでの問題は、バージョンがインクリメントされている場合、これはnullを返すことです。問題は、これが削除されたレコードと区別がつかないため、更新されたバージョンだけであることを確認するために文書がまだ存在するかどうかを確認するために2番目のクエリを使用する必要があるということです。

これは私の素朴なアプローチです。私は疑問に思っています:より効率的なモンゴでは、これに対してより適切なパターンがありますか?

答えて

0

この種の同時実行性は、クライアント側から処理されなければなりません。あなたがしているのは、AFAIKです。

これは、Mongoだけでなく、どのデータベースでもそうだと思います。

+0

SQL Serverでは、ストアドプロシージャに渡されたバージョン番号が現在レコードにあるバージョン番号と同じかどうかを確認するストアドプロシージャで簡単に処理できます。その場合は、レコードを更新します。そうでない場合は、エラーコードを返します。このタイプのアプローチには、Mongoに類似したものがありますか? –

関連する問題