Zugriff auf IndexedDB von mehreren Javascript-Threads aus

8

Ü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:

  1. Der Web-Mitarbeiter ruft Daten aus der Datenbank ab und sendet sie an den Server
  2. Während die Übertragung stattfindet, aktualisiert der Benutzer die Daten und speichert sie in der Datenbank.
  3. Der Web-Mitarbeiter erhält die Antwort vom Server und aktualisiert die Datenbank dann auf "Gesendet"
  4. Es gibt jetzt Daten in der Datenbank, die nicht an den Server gesendet, aber als "Gesendet"
  5. markiert wurden

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.

    
Shawn 27.01.2012, 18:41
quelle

2 Antworten

2

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.

    
Shawn 28.01.2012, 16:27
quelle
0

Können Sie eine Transaktion verwenden?
Ссылка

    
Fabrizio Accatino 28.01.2012 10:47
quelle