当同一个应用程序的另一个标签打开时数据库被阻止

时间:2015-06-01 18:48:22

标签: indexeddb

当通过IndexedDB存储数据的应用程序在同一浏览器的2个选项卡中打开时,代码尝试通过执行var dbDeleteRequest = window.indexedDB.deleteDatabase(DB_NAME, {storage: "temporary"});通过一个选项卡删除数据库,则onerroronsuccess都不会获得调用。

我可以确定数据库处于阻塞状态,因为应用程序在另一个选项卡中打开,我可以通过监听onblocked事件来验证它。

当我关闭其他标签时,onsuccess事件将被触发,因此这表明数据库现在未处于阻止状态。
然而,即使在两个选项卡中打开应用程序,我也可以执行select,insert等操作,这意味着数据库实际上并未阻止所有内容,而只是用于版本更改操作。

我检查过,在WebSQL的情况下也不会发生这种情况。

有没有办法在IndexedDB中处理这种情况。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

很抱歉,但很难解释你的问题是什么。你所描述的似乎正是indexedDB应该如何运作。如果数据库在多个选项卡中打开(指向同一个通用域),则数据库将触发某些事务的阻止事件,以保证数据的完整性。

通常,读取操作不能修改数据,因此读取操作是非阻塞的。写操作通常会修改数据,因此写操作通常会阻塞。在JS引擎的上下文中,对write的调用仍然是异步和非阻塞的,但不一定在数据库层中。

您所遇到的事情对我来说似乎是正常的预期行为,而不是问题。