Als generische Antwort können Multi-Document-Commits auf MongoDB als zweiphasige Commits ausgeführt werden, die im Handbuch ziemlich ausführlich dokumentiert wurden (siehe:http://docs.mongodb.org/manual/tutorial/perform-two-phase- committ/).
Das im Handbuch vorgeschlagene Muster lautet kurz wie folgt:
- Erstellen Sie separate
transactions
Sammlung, die Zieldokument enthält , Quelldokument , Wert und Zustand (der Transaktion) - Neues Transaktionsobjekt mit
initial
erstellen alsstate
- Starten Sie eine Transaktion und aktualisieren Sie den
state
zupending
- Transaktionen auf beide Dokumente anwenden (Ziel, Quelle)
- Transaktionsstatus auf
committed
aktualisieren - Verwenden Sie find, um zu bestimmen, ob Dokumente den Transaktionsstatus widerspiegeln, wenn ok, aktualisieren Sie den Transaktionsstatus auf
done
Außerdem:
- Sie müssen Fehlerszenarien manuell handhaben (etwas ist nicht wie unten beschrieben passiert)
- Sie müssen ein Rollback manuell implementieren, im Grunde durch die Einführung eines Namens
state
Wertcanceling
Einige spezifische Hinweise für Ihre Implementierung:
- Ich würde Ihnen davon abraten, Felder wie
lock_status
hinzuzufügen ,data_old
,data_new
in Quell-/Zieldokumente. Dies sollten Eigenschaften der Transaktionen sein, nicht die Dokumente selbst. - Um das Konzept von Ziel-/Quelldokumenten zu verallgemeinern, denke ich, dass Sie
DBref
verwenden könnten s:http://www.mongodb.org/display/DOCS/Database+References - Ich mag die Idee nicht, Transaktionsdokumente zu löschen, wenn sie fertig sind. Status auf
done
setzen scheint eine bessere Idee zu sein, da Sie auf diese Weise später debuggen und herausfinden können, welche Art von Transaktionen durchgeführt wurden. Ich bin mir ziemlich sicher, dass Ihnen der Speicherplatz auch nicht ausgehen wird (und dafür gibt es auch Lösungen). - Wie stellen Sie in Ihrem Modell sicher, dass alles wie erwartet geändert wurde? Überprüfen Sie die Änderungen irgendwie?