2016-08-29 6 views
1

2人のエージェントがMongoクラスタ上でこの更新クエリを同時に実行する場合、最後に期待値はどのくらいですかupdateVersionMongo DB並行動作のfindAndModify(インクリメント操作あり)

db.Task.findAndModify(
    { 
     query:{"updateVersion":21}, 
     update:{$inc:{"updateVersion":1}} 
    } 
); 

答えが "23"の場合、保証された読み取り/書き込み同期操作を行う方法はありますか?

答えて

0

MongoDBは、並行操作についてFAQ sectionを持っています。あなたのケースでは

write conflictが起こるかもしれませんが、MongoDBのはまだ両方のコマンドを実行してみてください:

書き込みで少なくとも一方が2つの同時操作、状況にリソースを使用しようとする試みオプティミスティックな並行性制御を使用してストレージエンジンによって課された制約に違反する可能性があります。 MongoDBは、競合する操作の1つを透過的に中止して再試行します。

+0

答えは? 22または23?私は既にFAQセクションを読んでいました。あなたの見積もりは本当に答えません。まず最初に、2つのオペレーションは競合を起こさないかもしれません:最初にバージョン21を見つけて22に増分し、2番目に22を見つけ、更新する文書がなくなり、誰もが幸せになります。 :https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify/。また、クラスタ環境では、同時クライアントが異なるインスタンスでコマンドを発行するとどうなりますか? – Deroude

+0

あなたは矛盾がないと言ったので、最初の操作の更新版のみが答えられるので、答えは22になるはずです。競合が発生すると、MongoDBは完全な操作(検索も)を再試行し、期待通りに最初のシナリオと同じ動作をします。 –

+0

それは私の(希望的な)思考すぎです:)しかし、もし両方のopsがドキュメントを見つけたら(読み込みロックなし)、次にバージョンフィールドを増やして(書き込みロック)、最終結果が23の場合はどうなりますか?紛争が起こっているとどう結論しましたか? – Deroude

関連する問題