首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IndexedDB线程安全

IndexedDB线程安全
EN

Stack Overflow用户
提问于 2013-12-20 16:00:07
回答 1查看 1.2K关注 0票数 1

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

我已经实现了这一点,它工作得很好。但是,现在我想更进一步--当用户需要与用户一起工作时,获取本地不可用的数据很容易破坏用户的工作时间。

因此,我正在考虑实现一个前瞻性,在用户想要使用这些数据之前获取服务器端数据。它的工作方式

  • 当应用程序启动时,我在与主应用程序共享的IndexedDB中生成了一个监视条目的网络工作者,名为IndexedDB。
  • 用户在可编辑项上盘旋,例如,HTML,abcd1234。
  • 在这个应用程序中,我将这个id添加到IndexedDB PreFetch键值--这是一个逗号分隔的id列表。
  • web工作人员定期获取PreFetch CSV列表,然后重置它,并获取那些本地不可用的数据,并将它们存储在对象存储中。

IndexedDB很好--毫无疑问。然而,我并不清楚我在计划什么--让两个线程更新相同的对象存储不会造成死锁(或者更糟糕的是,会使整个房子崩溃)。

考虑到IndexedDB操作的异步性质,我关注两种问题

主线程正在写入PreFetch密钥,而工作人员正在删除其内容。主线程尝试从IndexedDB中获取数据,并决定“它不在那里”,同时工作人员刚刚获取并存储了这些数据。

前者容易达到执行工作人员驱动的数据预取的目的,而后者则可能触发不必要的服务器通信量来获取已被获取的信息。

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

那么,我的问题是: IndexedDB方法是线程安全吗?谷歌搜索IndexedDB和线程安全,除了在这个论坛上发表一两篇文章之外,并没有产生任何非常有用的东西。

我想出了一种避免这个问题的方法--主线程和工作线程在尝试读/写对象存储之前都会在localStorage中检查一个标志变量。然而,我不清楚我是否需要这样做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-21 01:27:33

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

使用事务进行同步锁定,创建任务id的对象存储作为键和枚举的值“未决”、“工作”、“完成”。

如果对象存储中不存在生产者线程,则创建具有挂起值的任务。使用者线程将挂起的任务执行到工作中,并在完成后进行更改。应该管用的。

您可以使用webstorage事件实现页面间的同步锁定,但不能使用indexeddb。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20707469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档