MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

„Transaktionen“ mit mehreren Sammlungen und Dokumenten in MongoDB

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 als state
  • Starten Sie eine Transaktion und aktualisieren Sie den state zu pending
  • 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 Wert canceling

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?