Ich schreibe eine Finanzanwendung mit Firebase und für eine Empfangsbestätigung müssen auch einige andere Objekte aktualisiert werden. Damit die Daten gültig sind, müssen alle Datenaktualisierungen erfolgreich abgeschlossen werden. Wenn bei einem der Schreibvorgänge ein Fehler auftritt, müssen alle Aktualisierungen zurückgesetzt werden.
Zum Beispiel:
Wenn der Benutzer einen Beleg einreicht, müssen sowohl das Belegobjekt als auch ein Rechnungsobjekt sowie andere Hauptbuchobjekte aktualisiert werden.
Wenn das Update gestartet wurde, aber der Benutzer die Internetverbindung auf halbem Weg verloren hat, sollten alle Änderungen rückgängig gemacht werden.
Was ist der beste Weg, dies in Firebase zu erreichen?
Lassen Sie uns zunächst kurz darüber sprechen, warum jemand auf mehreren Datenpfaden Commit / Rollback durchführen möchte ...
Im Allgemeinen brauchen Sie das nicht, wenn:
Entwickler sind ein bisschen zu besorgt über verwaiste Datensätze in ihren Daten. Die Wahrscheinlichkeit, dass ein Web-Socket zwischen einem Schreibvorgang und dem anderen versagt, ist wahrscheinlich trivial und irgendwo in der Reihenfolge der Kollisionen zwischen Zeitstempel basierte IDs. Das heißt nicht, dass es unmöglich ist, aber es ist im Allgemeinen eine niedrige Konsequenz, höchst unwahrscheinlich, und sollte nicht Ihre Hauptsorge sein.
Auch Waisen sind extrem einfach mit einem Skript aufzuräumen oder einfach nur ein paar Zeilen Code in die JS-Konsole einzugeben. Also nochmal, Sie neigen dazu, sehr geringe Konsequenz zu sein.
Legen Sie alle Daten, die atomar geschrieben werden müssen, in einen einzigen Pfad. Dann können Sie es als eine einzelne festlegen oder ein Transaktion falls erforderlich.
Oder wenn ein Datensatz der primäre ist und die anderen davon abhängen, schreiben Sie einfach zuerst den primären und dann die anderen in den Callback. Fügen Sie Sicherheitsregeln hinzu, um dies zu erzwingen, sodass der primäre Datensatz immer existiert, bevor die anderen schreiben dürfen.
Wenn Sie Daten einfach denormalisieren, um sie einfach und schnell zu iterieren (z. B. um eine Liste von Namen für Benutzer zu erhalten), indexieren Sie diese Daten einfach in einem separaten Pfad. Dann können Sie den vollständigen Datensatz in einem einzigen Pfad und die Namen, E-Mails usw. in einer schnellen, query / sort-freundlichen Liste haben.
Dies ist ein geeignetes Werkzeug, wenn Sie eine denormalisierte Menge von Datensätzen haben, die:
Die Idee besteht darin, mithilfe von Aktualisierungszählern sicherzustellen, dass alle Pfade dieselbe Revision beibehalten.
Da Sicherheitsregeln vorhanden sind, können Datensätze nur erfolgreich geschrieben werden, wenn der Zähler nicht verschoben wird. Wenn es sich bewegt, wurden die Datensätze durch eine gleichzeitige Änderung überschrieben, so dass sie keine Rolle mehr spielen (sie sind nicht mehr die neuesten und größten).
%Vor%Rollbacks sind etwas komplizierter, können aber von diesem Prinzip abgeleitet werden:
Ich habe heute eine Lib geschrieben, die das tut und auf GitHub stopft . Fühlen Sie sich frei, es zu benutzen, aber bitte stellen Sie sicher, dass Sie Ihr Leben nicht kompliziert machen, indem Sie lesen "Brauchen Sie das?" oben.