Die Firebase-Transaktion liest im Pfad null, selbst wenn sich Daten in diesem Pfad befinden

Dec 22 2020

Ich verstehe, dass Firebase-Transaktionen manchmal Daten als null lesen, aber dann wird die Schleife erneut ausgeführt, bis der Wert vom Server abgerufen und festgeschrieben wird. Ich bin jedoch mit einer einzigartigen Situation konfrontiert, in der die Transaktion Nulldaten liest und den Wert festschreibt, den ich im Falle von Null zurückgebe. Bitte schauen Sie sich den beigefügten Code an.

 deductTransaction.transaction((current_value) => {
       if (current_value != null) {
           return current_value - cost;
       }
       return 25;
   });

Im obigen Code ist "deductTransaction" der Pfad der Daten (Nummer), die ich aktualisieren möchte

Der obige Code läuft in einigen Fällen einwandfrei, dh die Schleife wird erneut ausgeführt, wenn null gelesen wird, und manchmal wird sie nur einmal ausgeführt, liest den Wert als null, selbst wenn sich einige Daten in diesem Pfad befanden, und schreibt dann 25 fest, wodurch die ursprünglichen Daten zerstört werden

PS: Ich bin kurz davor, mir die Haare auszureißen, daher wäre jede Hilfe sehr willkommen

Antworten

1 FrankvanPuffelen Dec 22 2020 at 20:48

Wenn Sie eine Transaktion an einem Ort ausführen, wird der Rückruf / Handler sofort mit der aktuellen Schätzung des Clients für den Wert an diesem Ort aufgerufen. Am häufigsten wird diese anfängliche Schätzung des aktuellen Werts sein null.

Ihr Handler muss mit dieser Situation umgehen. Also: Sagen Sie, dass am Standort keine Daten vorhanden sind und Sie die Kosten abziehen möchten. Was würde passieren? Normalerweise kehren Sie entweder zurück -25oder weisen die Transaktion zum Abbruch an.

So oder so: Die anfängliche Schätzung und der neue Wert werden an den Datenbankserver gesendet, der dann erkennt, dass die anfängliche Schätzung falsch war, und den aktuellen Wert an den Aufrufer zurückgibt. Das SDK ruft dann Ihren Handler / Rückruf erneut auf, wobei der aktuelle Wert (hoffentlich nicht korrekt) am besten geschätzt wird.

Siehe auch:

  • Der Transaktionshandler für Firebase-Echtzeitdatenbanken wird die meiste Zeit zweimal aufgerufen (mit einem Diagramm des obigen Ablaufs).
  • Firebase runTransaction funktioniert nicht - MutableData ist null
  • Grundlegendes zur Konfliktlösung in Firebase
  • Warum sind die currentData in meiner Firebase-Transaktion immer gleich Null?

Hinweis: Mit dem incrementOperator können Sie heutzutage Inkrementierungs- und Dekrementierungsvorgänge ohne Transaktion ausführen . Dies wird Ihren Code erheblich vereinfachen und eine bessere Leistung erzielen, wie unter Wie schnell können Sie einen Wert in der Firebase-Echtzeitdatenbank atomar erhöhen? .

Zum Vergleich: Der incrementBediener nimmt einen aktuellen Wert an, 0wenn am Standort kein Wert vorhanden ist.