在我当前的webapp中,显示可以包含多个可编辑的对象--这些数据要么从服务器获取(然后存储以供将来使用),要么从本地IndexedDB对象存储中获取。
我已经实现了这一点,它工作得很好。但是,现在我想更进一步--当用户需要与用户一起工作时,获取本地不可用的数据很容易破坏用户的工作时间。
因此,我正在考虑实现一个前瞻性,在用户想要使用这些数据之前获取服务器端数据。它的工作方式
IndexedDB很好--毫无疑问。然而,我并不清楚我在计划什么--让两个线程更新相同的对象存储不会造成死锁(或者更糟糕的是,会使整个房子崩溃)。
考虑到IndexedDB操作的异步性质,我关注两种问题
主线程正在写入PreFetch密钥,而工作人员正在删除其内容。主线程尝试从IndexedDB中获取数据,并决定“它不在那里”,同时工作人员刚刚获取并存储了这些数据。
前者容易达到执行工作人员驱动的数据预取的目的,而后者则可能触发不必要的服务器通信量来获取已被获取的信息。
我可能可以通过使用localStorage共享PreFetch列表来避免前者。后者我无法控制。
那么,我的问题是: IndexedDB方法是线程安全吗?谷歌搜索IndexedDB和线程安全,除了在这个论坛上发表一两篇文章之外,并没有产生任何非常有用的东西。
我想出了一种避免这个问题的方法--主线程和工作线程在尝试读/写对象存储之前都会在localStorage中检查一个标志变量。然而,我不清楚我是否需要这样做。
发布于 2013-12-21 01:27:33
Javascript只有一个线程,所以线程是安全的。
使用事务进行同步锁定,创建任务id的对象存储作为键和枚举的值“未决”、“工作”、“完成”。
如果对象存储中不存在生产者线程,则创建具有挂起值的任务。使用者线程将挂起的任务执行到工作中,并在完成后进行更改。应该管用的。
您可以使用webstorage事件实现页面间的同步锁定,但不能使用indexeddb。
https://stackoverflow.com/questions/20707469
复制相似问题