IDBTransaction
注意:此功能在Web Workers中可用。
IDBTransaction
是IndexedDB API的接口,它使用事件处理程序属性提供数据库上的静态异步事务。所有数据读取和写入都在事务中完成。您可以使用IDBDatabase
启动事务,使用IDBTransaction
设置事务的模式(例如,它是readonly
还是readwrite
),并访问IDBObjectStore
以发出请求。您还可以使用IDBTransaction
对象中止事务。
事务在创建时开始,而不是在发出第一个请求时开始;例如,请考虑以下情况
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
之后运行。
事务在事件循环任务之间交替处于活动和非活动状态。它在其创建的任务中处于活动状态,以及在请求的success
或error
事件处理程序的每个任务中处于活动状态。在所有其他任务中它处于非活动状态,在这种情况下,发出请求将失败。如果在事务处于活动状态时没有发出新的请求,并且没有其他未完成的请求,则事务将自动提交。
事务失败
事务可能由于多种原因而失败,所有这些原因(除了用户代理崩溃)都将触发中止回调
- 由于错误请求而中止,例如尝试两次
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 中进行的)。您应该在代码中进行防御性编程,以防对象不再可用。
const myIDBTransaction = window.IDBTransaction ||
window.webkitIDBTransaction || { READ_WRITE: "readwrite" };
示例
在以下代码片段中,我们在数据库上打开一个读/写事务,并将一些数据添加到对象存储中。还要注意附加到事务事件处理程序的函数,以便在成功或失败的情况下报告事务打开的结果。有关完整的运行示例,请参阅我们的待办事项通知应用程序(查看示例)。
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 的浏览器中加载。
另请参阅
- 使用 IndexedDB
- 启动事务:
IDBDatabase
- 设置键范围:
IDBKeyRange
- 检索和更改您的数据:
IDBObjectStore
- 使用游标:
IDBCursor
- 参考示例:待办事项通知(查看示例)。