在我当前的webapp中,显示可以包含多个可编辑对象 - 数据从服务器获取(然后存储以供将来使用)或从本地IndexedDB对象库中获取。
我已经实施了它并且它完美地工作。但是,现在我想更进一步 - 当用户需要使用它们时,获取本地不可用的数据可能会打破用户工作的节奏。
所以我正在考虑实现一个前瞻,在用户想要使用它们之前获取服务器端数据。这样做的方式
IndexedDB很不错 - 毫无疑问。但是,我不清楚我正在计划什么 - 让两个线程更新同一个对象库不会造成死锁(或者更糟糕的是 - 让整个房子在我耳边崩溃)。
鉴于IndexedDB操作的异步性,我担心两种问题
一个。主线程是在工作人员删除其内容时写入PreFetch键。 湾主线程尝试从IndexedDB获取数据并决定“它不存在”,同时工作者刚刚获取了这些数据并存储它们。
前者可能会破坏执行工作驱动数据预取的目的,而后者可能会触发不必要的服务器流量来获取已经获取的信息。
前者我可以通过使用localStorage来共享PreFetch列表来避免。后者我无法控制。
我的问题是 - IndexedDB方法线程安全吗?谷歌搜索索引数据库和线程安全并没有产生任何非常有用的东西,除了这个论坛上的一两个帖子。
我想到了一种避免此问题的方法 - 主线程和worker在尝试读取/写入objectstore之前都检查localStorage中的标志变量。但是,我不清楚我需要这样做。
答案 0 :(得分:1)
Javascript只有一个线程,所以它是线程安全的。
使用事务进行同步锁定,将任务ID的对象存储创建为关键字和枚举值' pending' ,'工作','完成'。
生产者线程创建具有挂起值的任务(如果对象库中不存在)。消费者线程将待处理任务转为工作,并在完成后完成更改。它应该工作。
您可以在页面之间使用webstorage change事件进行同步锁定,但不能使用indexeddb。