IndexedDB线程安全

时间:2013-12-20 16:00:07

标签: multithreading indexeddb

在我当前的webapp中,显示可以包含多个可编辑对象 - 数据从服务器获取(然后存储以供将来使用)或从本地IndexedDB对象库中获取。

我已经实施了它并且它完美地工作。但是,现在我想更进一步 - 当用户需要使用它们时,获取本地不可用的数据可能会打破用户工作的节奏。

所以我正在考虑实现一个前瞻,在用户想要使用它们之前获取服务器端数据。这样做的方式

  • 当应用程序启动时,我会生成一个Web工作程序,它在与主应用程序共享的IndexedDB中监视条目,称之为PreFetch。
  • 用户将鼠标悬停在可编辑的项目上,例如HTML id,abcd1234。
  • 在应用程序中,我将此id添加到IndexedDB PreFetch键值 - 这是一个以逗号分隔的ID列表。
  • Web工作人员会定期选择PreFetch CSV列表,然后重置它,并获取那些本地不可用的数据并将它们存储在objectstore中。

IndexedDB很不错 - 毫无疑问。但是,我不清楚我正在计划什么 - 让两个线程更新同一个对象库不会造成死锁(或者更糟糕的是 - 让整个房子在我耳边崩溃)。

鉴于IndexedDB操作的异步性,我担心两种问题

一个。主线程是在工作人员删除其内容时写入PreFetch键。 湾主线程尝试从IndexedDB获取数据并决定“它不存在”,同时工作者刚刚获取了这些数据并存储它们。

前者可能会破坏执行工作驱动数据预取的目的,而后者可能会触发不必要的服务器流量来获取已经获取的信息。

前者我可以通过使用localStorage来共享PreFetch列表来避免。后者我无法控制。

我的问题是 - IndexedDB方法线程安全吗?谷歌搜索索引数据库和线程安全并没有产生任何非常有用的东西,除了这个论坛上的一两个帖子。

我想到了一种避免此问题的方法 - 主线程和worker在尝试读取/写入objectstore之前都检查localStorage中的标志变量。但是,我不清楚我需要这样做。

1 个答案:

答案 0 :(得分:1)

Javascript只有一个线程,所以它是线程安全的。

使用事务进行同步锁定,将任务ID的对象存储创建为关键字和枚举值' pending' ,'工作','完成'。

生产者线程创建具有挂起值的任务(如果对象库中不存在)。消费者线程将待处理任务转为工作,并在完成后完成更改。它应该工作。

您可以在页面之间使用webstorage change事件进行同步锁定,但不能使用indexeddb。