2016-08-29 6 views
1

Wenn zwei Agenten diese Update-Abfrage gleichzeitig auf einem Mongo-Cluster ausführen, was ist der erwartete Wert von updateVersion am Ende?Mongo DB gleichzeitige findAndModify mit Inkrement-Operation

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

Wenn die Antwort "23" ist, gibt es eine Möglichkeit, eine garantierte synchronisierte Lese-/Schreiboperation zu haben?

Antwort

0

MongoDB haben FAQ section über gleichzeitige Operationen.

In Ihrem Fall write conflict passieren könnte, aber MongoDB versucht immer noch beiden Befehle auszuführen:

Eine Situation, in der zwei gleichzeitige Vorgänge, mindestens eines davon ein Schreib ist, Versuch, eine Ressource in einem zu verwenden, Dies würde die Einschränkungen verletzen, die von einer Speicher-Engine auferlegt werden, die die optimistische Gleichzeitigkeitskontrolle verwendet. MongoDB wird einen der widersprüchlichen Vorgänge transparent abbrechen und erneut versuchen.

+0

Also ... die Antwort ist? 22 oder 23? Ich hatte bereits den FAQ-Bereich gelesen. Dein Zitat antwortet nicht wirklich. Zuallererst können die beiden Ops überhaupt keinen Konflikt verursachen: Zuerst findet man die Version 21 und erhöht auf 22, zweitens findet man 22, kein zu aktualisierendes Dokument, alle sind glücklich - vorausgesetzt, die Schreib-/Lesesperre ist entsprechend nicht klar : https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify/. Was passiert in einer Cluster-Umgebung auch, wenn die gleichzeitigen Clients den Befehl auf verschiedenen Instanzen ausgeben? – Deroude

+0

Die Antwort sollte 22 sein, denn wie Sie gesagt haben, wenn es keinen Konflikt geben wird, nur die erste Operation Update-Version. Wenn es einen Konflikt gibt, wird MongoDB den vollen Vorgang wiederholen (Suche auch) und funktioniert wie erwartet genauso wie beim ersten Szenario. –

+0

Das ist mein (Wunsch-) Denken auch :) - aber was ist, wenn beide Ops das Dokument finden (keine Lesesperre), dann abwechselnd das Versionsfeld inkrementieren (Schreibsperre) und das Endergebnis ist 23? Wie sind Sie zu dem Schluss gekommen, dass es einen Konflikt geben könnte? – Deroude