IDBDatabase: transaction() 方法

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

注意:此功能在 Web Workers 中可用。

IDBDatabase 接口的 transaction 方法会立即返回一个包含 IDBTransaction.objectStore 方法的事务对象 (IDBTransaction),您可以使用它来访问您的对象存储。

语法

js
transaction(storeNames)
transaction(storeNames, mode)
transaction(storeNames, mode, options)

参数

storeNames

新事务范围内对象存储的名称,声明为字符串数组。只指定您需要访问的对象存储。如果您只需要访问一个对象存储,可以将它的名称指定为字符串。因此,以下两行是等效的

js
db.transaction(["my-store-name"]);
db.transaction("my-store-name");

如果您需要访问数据库中的所有对象存储,可以使用 IDBDatabase.objectStoreNames 属性

js
const transaction = db.transaction(db.objectStoreNames);

传入一个空数组将抛出异常。

mode 可选

可以在事务中执行的访问类型。事务以三种模式之一打开

readonly

为从对象存储读取事务打开。这是默认模式。

readwrite

为从对象存储读取和写入事务打开。只有在需要写入数据库时才应使用此模式。

readwriteflush 非标准 实验性

强制事务在 complete 事件发生之前刷新到磁盘。这可能用于存储无法稍后重新计算的关键数据。

options 可选

定义附加选项的对象,包括

durability

以下三种字符串字面值之一

"strict"

用户代理可能认为事务已成功提交,只有在验证所有挂起更改已成功写入持久存储介质后才算完成。当数据丢失的风险大于其对性能和功耗的影响(与 relaxed 相比)时,推荐此选项。

"relaxed"

用户代理可能认为事务已成功提交,只要所有挂起更改已写入操作系统,无需后续验证。这比 strict 提供了更好的性能,并推荐用于临时数据,如缓存或快速更改的记录。

"default"

用户代理应使用其存储桶的默认持久性行为。如果未另行指定,则这是事务的默认行为。

返回值

IDBTransaction 对象。

异常

InvalidStateError DOMException

如果此 IDBDatabase 实例先前已调用 close() 方法,则会抛出此异常。

NotFoundError DOMException

如果 'storeNames' 参数中指定的对象存储已被删除或移除,则会抛出此异常。

TypeError

如果 mode 参数的值无效,则会抛出此异常。

InvalidAccessError DOMException

如果函数使用空的对象存储名称列表调用,则会抛出此异常。

示例

在此示例中,我们打开数据库连接,然后使用 transaction() 在数据库上打开一个事务。有关完整示例,请参阅我们的 待办事项通知 应用(在线查看示例)。

js
let db;

// Let us open our database
const DBOpenRequest = window.indexedDB.open("toDoList", 4);

DBOpenRequest.onsuccess = (event) => {
  note.appendChild(document.createElement("li")).textContent =
    "Database initialized.";

  // store the result of opening the database in the db variable.
  // This is used a lot below
  db = DBOpenRequest.result;

  // Run the displayData() function to populate the task list with
  // all the to-do list data already in the IDB
  displayData();
};

// open a read/write db transaction, ready for adding the data
const transaction = db.transaction(["toDoList"], "readwrite");

// report on the success of opening the transaction
transaction.oncomplete = (event) => {
  note.appendChild(document.createElement("li")).textContent =
    "Transaction completed: database modification finished.";
};

transaction.onerror = (event) => {
  note.appendChild(document.createElement("li")).textContent =
    "Transaction not opened due to error. Duplicate items not allowed.";
};

// you would then go on to do something to this database
// via an object store
const objectStore = transaction.objectStore("toDoList");
// etc.

规范

规范
Indexed Database API 3.0
# ref-for-dom-idbdatabase-transaction③

浏览器兼容性

另见