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:https://docs.mongodb.org/manual/tutorial/perform-two-phase- committ/).
Das im Handbuch vorgeschlagene Muster lautet kurz wie folgt:
- Erstellen Sie separate
transactionsSammlung, die Zieldokument enthält , Quelldokument , Wert und Zustand (der Transaktion) - Neues Transaktionsobjekt mit
initialerstellen alsstate - Starten Sie eine Transaktion und aktualisieren Sie den
statezupending - Transaktionen auf beide Dokumente anwenden (Ziel, Quelle)
- Transaktionsstatus auf
committedaktualisieren - 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
stateWertcanceling
Einige spezifische Hinweise für Ihre Implementierung:
- Ich würde Ihnen davon abraten, Felder wie
lock_statushinzuzufügen ,data_old,data_newin Quell-/Zieldokumente. Dies sollten Eigenschaften der Transaktionen sein, nicht die Dokumente selbst. - Um das Konzept von Ziel-/Quelldokumenten zu verallgemeinern, denke ich, dass Sie
DBrefverwenden könnten s:https://www.mongodb.org/display/DOCS/Database+References - Ich mag die Idee nicht, Transaktionsdokumente zu löschen, wenn sie fertig sind. Status auf
donesetzen 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?