在 IndexedDB 事务中定义范围

Ido Green

什么是 IndexedDB?

IndexedDB 是一种不断发展的网络标准,用于在浏览器中存储大量结构化数据,以及使用索引对这些数据进行高性能搜索。换句话说,IndexedDB 是一个对象存储。它与关系型数据库不同,后者包含包含集合行和列的表。它是一种非常重要的根本性区别,会影响您设计和构建应用的方式(详情请参见基本概念)。

那么有哪些新变化呢?

更改朋友... 我们进行的一些更改,如果不通过简单的语法更改来处理,就会抛出一些错误。

从版本 17 开始,如果 IndexedDB 事务的范围未限定为对象存储,Chrome 就会抛出错误。由于所有的读取和写入操作都是在事务中完成的,因此我们需要在数据库上创建事务,指定作用域(例如您要访问的对象存储)并确定访问类型(只读或写入)。

它在代码中的含义是什么? 我们无需向 database.transaction 传递空数组:

var transaction = db.transaction([], IDBTransaction.READ_ONLY);

您应该将作用域限定为特定的对象存储或对象存储列表:

// all stores (equivalent to what use to be marked as empty array. )
var transaction = db.transaction(db.objectStoreNames, IDBTransaction.READ_ONLY);

// multiple stores:
var transaction = db.transaction(['ObjectStoreName1', 'ObjectStoreName2'],
    IDBTransaction.READ_ONLY);

// single store - these are equivalent
var transaction = db.transaction(['ObjectStoreName'], IDBTransaction.READ_ONLY);
var transaction = db.transaction('ObjectStoreName', IDBTransaction.READ_ONLY);

您可以在事务中使用正确的范围和模式,以加快数据访问速度。以下是几条提示:定义范围时,请仅指定所需的对象存储。这样,您可以同时运行范围不重叠的多个事务。仅在必要时指定 READ_WRITE 事务模式。您可以同时运行多个范围重叠的 READ_ONLY 事务,但一个对象存储只能有一个 READ_WRITE 事务。

其他来源:

下次再见了...继续将网络推广至邻近地区。