IDBTransaction

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

IDBTransactionIndexedDB API的接口,它使用事件处理程序属性提供数据库上的静态异步事务。所有数据读取和写入都在事务中完成。您可以使用IDBDatabase启动事务,使用IDBTransaction设置事务的模式(例如,它是readonly还是readwrite),并访问IDBObjectStore以发出请求。您还可以使用IDBTransaction对象中止事务。

EventTarget IDBTransaction

事务在创建时开始,而不是在发出第一个请求时开始;例如,请考虑以下情况

js
const trans1 = db.transaction("foo", "readwrite");
const trans2 = db.transaction("foo", "readwrite");
const objectStore2 = trans2.objectStore("foo");
const objectStore1 = trans1.objectStore("foo");
objectStore2.put("2", "key");
objectStore1.put("1", "key");

代码执行后,对象存储应包含值“2”,因为trans2应在trans1之后运行。

事务在事件循环任务之间交替处于活动非活动状态。它在其创建的任务中处于活动状态,以及在请求的successerror事件处理程序的每个任务中处于活动状态。在所有其他任务中它处于非活动状态,在这种情况下,发出请求将失败。如果在事务处于活动状态时没有发出新的请求,并且没有其他未完成的请求,则事务将自动提交。

事务失败

事务可能由于多种原因而失败,所有这些原因(除了用户代理崩溃)都将触发中止回调

  • 由于错误请求而中止,例如尝试两次add()相同的键,或使用具有唯一性约束的相同索引键put()。这会导致请求出错,错误可能会冒泡到事务上的错误,从而中止事务。这可以通过在请求上的错误事件上使用preventDefault()来防止。
  • 来自脚本的显式abort()调用。
  • 请求的success/error处理程序中的未捕获异常。
  • I/O 错误(例如,实际写入磁盘失败或其他操作系统/硬件故障)。
  • 配额已满。
  • 用户代理崩溃。

Firefox 持久性保证

请注意,从 Firefox 40 开始,IndexedDB 事务已放松了持久性保证以提高性能(请参阅Firefox 错误 1112702)。以前在readwrite事务中,只有在保证所有数据都已刷新到磁盘后才会触发complete事件。在 Firefox 40 及更高版本中,complete事件在操作系统被告知写入数据后触发,但可能在数据实际刷新到磁盘之前触发。因此,complete事件可能会比以前更快地传递,但是,如果操作系统崩溃或在数据刷新到磁盘之前系统断电,则整个事务存在丢失的可能性。由于此类灾难性事件很少发生,因此大多数用户无需进一步关注。

如果您必须出于某种原因确保持久性(例如,您正在存储以后无法重新计算的关键数据),则可以在传递complete事件之前强制事务刷新到磁盘,方法是使用实验性(非标准)readwriteflush模式创建事务(请参阅IDBDatabase.transaction)。

实例属性

IDBTransaction.db 只读

与此事务关联的数据库连接。

IDBTransaction.durability 只读

返回创建事务时使用的持久性提示。

IDBTransaction.error 只读

返回一个DOMException,指示事务不成功时发生的错误类型。如果事务未完成、已完成并成功提交,或使用IDBTransaction.abort()函数中止,则此属性为null

IDBTransaction.mode 只读

用于隔离对事务范围内对象存储中数据的访问的模式。默认值为readonly

IDBTransaction.objectStoreNames 只读

返回一个DOMStringList,其中包含与此事务关联的IDBObjectStore对象的名称。

实例方法

继承自:EventTarget

IDBTransaction.abort()

回滚对与此事务关联的数据库中对象的所有更改。如果此事务已被中止或完成,则此方法将触发错误事件。

IDBTransaction.objectStore()

返回一个IDBObjectStore对象,表示作为此事务范围一部分的对象存储。

IDBTransaction.commit()

对于活动事务,提交事务。请注意,这通常不需要调用 - 当所有未完成的请求都已满足且没有发出新的请求时,事务将自动提交。commit()可用于启动提交过程,而无需等待来自未完成请求的事件调度。

事件

使用addEventListener()或通过将事件侦听器分配到此接口的oneventname属性来侦听这些事件。

abort

IndexedDB事务中止时触发的事件。也可通过onabort属性获得;此事件冒泡到IDBDatabase

complete

事务成功完成时触发的事件。也可通过oncomplete属性获得。

错误

请求返回错误并且事件冒泡到连接对象(IDBDatabase)时触发的事件。也可通过onerror属性获得。

模式常量

已弃用:不再推荐使用此功能。尽管某些浏览器可能仍支持它,但它可能已从相关的 Web 标准中删除,可能正在被删除,或者可能仅出于兼容性目的而保留。避免使用它,并尽可能更新现有代码;请参阅此页面底部的兼容性表以指导您的决策。请注意,此功能可能随时停止工作。

警告:这些常量不再可用 - 它们在 Gecko 25 中已删除。您应该改为直接使用字符串常量。(Firefox 错误 888598

事务可以具有三种模式之一

常量 描述
READ_ONLY "readonly"(Chrome 中为 0)

允许读取数据,但不能更改数据。

READ_WRITE "readwrite"(Chrome 中为 1) 允许读取和写入数据,并允许更改现有数据存储中的数据。
VERSION_CHANGE "versionchange"(Chrome 中为 2) 允许执行任何操作,包括删除和创建对象存储和索引的操作。此模式的事务不能与其他事务并发运行。此模式下的事务称为“升级事务”。

即使这些常量现在已弃用,您仍然可以使用它们来提供向后兼容性(在 Chrome 中更改是在版本 21 中进行的)。您应该在代码中进行防御性编程,以防对象不再可用。

js
const myIDBTransaction = window.IDBTransaction ||
  window.webkitIDBTransaction || { READ_WRITE: "readwrite" };

示例

在以下代码片段中,我们在数据库上打开一个读/写事务,并将一些数据添加到对象存储中。还要注意附加到事务事件处理程序的函数,以便在成功或失败的情况下报告事务打开的结果。有关完整的运行示例,请参阅我们的待办事项通知应用程序(查看示例)。

js
const note = document.getElementById("notifications");

// an instance of a db object for us to store the IDB data in
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;

  // Add the data to the database
  addData();
};

function addData() {
  // Create a new object to insert into the IDB
  const newItem = [
    {
      taskTitle: "Walk dog",
      hours: 19,
      minutes: 30,
      day: 24,
      month: "December",
      year: 2013,
      notified: "no",
    },
  ];

  // open a read/write db transaction, ready to add 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.";
  };

  // create an object store on the transaction
  const objectStore = transaction.objectStore("toDoList");

  // add our newItem object to the object store
  const objectStoreRequest = objectStore.add(newItem[0]);

  objectStoreRequest.onsuccess = (event) => {
    // report the success of the request (this does not mean the item
    // has been stored successfully in the DB - for that you need transaction.oncomplete)
    note.appendChild(document.createElement("li")).textContent =
      "Request successful.";
  };
}

规范

规范
Indexed Database API 3.0
# 事务

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。

另请参阅