Доступ к IndexedDB из нескольких потоков javascript

Обзор: Я пытаюсь избежать состояния гонки при доступе к IndexedDB как с веб-страницы, так и с веб-рабочего.

Настройка: Веб-страница, которая сохраняет элементы в локальную IndexedDB, когда пользователь работает с сайтом. Всякий раз, когда пользователь сохраняет данные в локальной БД, запись помечается как «Не отправлено».

Фоновый поток Web-worker, который извлекает данные из IndexedDB, отправляет их на сервер и, как только сервер их получает, помечает данные в IndexedDB как «Отправленные».

Проблема: Поскольку доступ к IndexedDB является асинхронным, я не могу гарантировать, что пользователь не обновит запись в то же время, когда веб-работник отправляет ее на сервер. Временная шкала показана ниже:

  1. Web-worker получает данные из БД и отправляет их на сервер
  2. Пока происходит передача, пользователь обновляет данные, сохраняя их в БД.
  3. Веб-работник получает ответ от сервера и затем обновляет базу данных на «Отправлено»
  4. Теперь в базе данных есть данные, которые не были отправлены на сервер, но помечены как «Отправлено»

Не удалось Решение: Получив ответ от сервера, я могу еще раз проверить строку, чтобы увидеть, не было ли что-то изменено. Однако у меня все еще остается небольшое окно, в котором данные могут быть записаны в БД, и они никогда не будут отправлены на сервер.

Пример: После того, как сервер сообщит, что данные сохранены, затем:

IndexedDB.HasDataChanged(
    function(changed) { 
        // Since this is async, this changed boolean could be lying.
        // The data might have been updated after I checked and before I was called.
        if (!changed){ 
          IndexedDB.UpdateToSent() }
    });

Другие примечания: В соответствии со спецификацией W3 существует api синхронизации, но его еще никто не реализовал, поэтому его нельзя использовать (http://www.w3.org/TR/IndexedDB/#sync-database). Sync api был разработан для использования веб-рабочими, чтобы избежать именно такой ситуации, как я полагаю.

Мы будем очень признательны за любые мысли по этому поводу. Работали над этим около недели и не смогли придумать ничего, что сработало бы.

9
задан Shawn 27 January 2012 в 18:41
поделиться