Übersicht: Ich versuche, eine Race-Bedingung zu vermeiden, indem ich sowohl von einer Webseite als auch von einem Web-Mitarbeiter auf eine IndexedDB zugreife.
Einrichtung: Webseite, die Elemente in der lokalen IndexedDB speichert, wenn der Benutzer mit der Site arbeitet. Wenn ein Benutzer Daten in der lokalen DB speichert, wird der Datensatz als "Nicht gesendet" markiert.
Web-Worker-Hintergrundthread zieht Daten aus der IndexedDB, sendet sie an den Server und sobald der Server sie empfängt, markiert er die Daten in der IndexedDB als "Gesendet".
Problem: Da der Zugriff auf die IndexedDB asynchron ist, kann nicht garantiert werden, dass der Benutzer einen Datensatz nicht gleichzeitig mit dem Senden des Datensatzes an den Server aktualisiert. Die Zeitleiste ist unten gezeigt:
Fehlgeschlagene Lösung: Nachdem ich die Antwort vom Server erhalten habe, kann ich die Zeile erneut überprüfen, um festzustellen, ob etwas geändert wurde. Ich habe jedoch immer noch ein kleines Fenster, in dem Daten in die DB geschrieben werden können und niemals an den Server gesendet werden.
Beispiel: Nachdem der Server die Daten gespeichert hat, dann:
%Vor%Weitere Hinweise: Es gibt eine Sync-API gemäß der W3-Spezifikation, aber niemand hat sie bereits implementiert, so dass sie nicht verwendet werden kann (http://www.w3.org/TR/IndexedDB/#sync-database). Die Sync-API wurde von Web-Arbeitern entwickelt, um genau diese Situation zu vermeiden.
Irgendwelche Gedanken dazu würden sehr geschätzt werden. Ich habe ungefähr eine Woche daran gearbeitet und konnte mir nichts einfallen lassen, was funktionieren würde.
Ich denke, ich habe vorläufig eine Arbeit gefunden. Nicht wirklich so sauber, wie ich möchte, aber es scheint threadsicher zu sein.
Ich beginne mit dem Speichern der Datetime in einem LastEdit-Feld, wenn ich die Daten aktualisiere. Vom Web-Mitarbeiter posten wir eine Nachricht an den Browser.
%Vor%Im Browser aktualisiere ich dann mein gesendetes Flag, solange sich das letzte Bearbeitungsdatum nicht geändert hat.
%Vor%Da dies alles in einer Transaktion auf der Browser-Seite getan wird, scheint es gut zu funktionieren. Sobald die Browser die Sync API unterstützen, kann ich sie sowieso wegwerfen.
Tags und Links javascript web-worker indexeddb