当同一应用程序的另一个选项卡打开时,数据库被阻塞

Database get blocked when another tab of same application is open

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

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

只要我关闭其他选项卡,onsuccess 事件就会被触发,所以这表明数据库现在没有处于阻塞状态。
然而,即使在两个选项卡中都打开了应用程序,我也可以执行 select、插入等操作,这意味着数据库实际上并没有为所有内容而被阻止,而只是为版本更改操作而被阻止。

我检查了一下,在 WebSQL 的情况下没有发生同样的情况。

在 IndexedDB 中有什么办法可以处理这种情况吗?

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

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

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

看文档,虽然不是很清楚,但是有关于这个问题的示例代码:

https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB#Version_changes_while_a_web_app_is_open_in_another_tab