IDBTransaction - 为数据库提供静态异步事务
IDBTransaction
是 IndexedDB API 的接口,使用事件处理程序属性为数据库上提供静态异步事务。所有数据的读写都是在事务中完成的。实际上,您使用 IDBDatabase
来启动事务,使用 IDBTransaction
来设置事务的模式(例如,它是 readonly
或 readwrite
),并访问 IDBObjectStore
发出请求。您也可以使用它来中止事务。
请注意,从 Firefox 40 开始,IndexedDB 事务具有宽松的持久性保证以提高性能(请参阅 Mozilla bug 1112702。)以前在 readwrite
事务中 IDBTransaction.oncomplete
是仅在保证所有数据都已刷新到磁盘时才触发。在 Firefox 40+ 中,在告知操作系统写入数据之后,可能会在实际上将数据刷新到磁盘之前触发 complete
事件。因此,complete
事件可以比以前更快地传递,但是,如果操作系统崩溃或者在将数据刷新到磁盘之前系统电源丢失,则整个事务有小概率会丢失。由于这种灾难性事件很少见,大多数开发者不用进一步去关注。
如果由于某种原因必须确保持久性(例如,您要存储以后无法重新计算的关键数据),则可以通过使用实验(非标准)的 readwriteflush
模式,创建事务来强制事务在传递 complete
事件之前刷新到磁盘 (参见 IDBDatabase.transaction
。
请注意,事务在创建事务时启动,而不是在放置第一个请求时启动;例如考虑这个:
var trans1 = db.transaction("foo", "readwrite");
var trans2 = db.transaction("foo", "readwrite");
var objectStore2 = trans2.objectStore("foo")
var objectStore1 = trans1.objectStore("foo")
objectStore2.put("2", "key");
objectStore1.put("1", "key");
执行代码后,对象存储应该包含值 “2”,因为 trans2
应该在 trans1
之后运行。
事务可能由于多种原因而失败,所有这些原因(用户代理崩溃除外)都会触发中止回调:
- 由于错误请求而中止,例如尝试两次
add()
相同的键,或者在具有唯一性约束的索引键调用put()
,这会导致请求出错,并将错误冒泡到事务,这可能会导致事务中的错误,从而中止事务。可以通过在请求的错误事件中调用preventDefault()
来终止错误。 - 在脚本中显式调用
abort()
- 请求的成功/错误处理程序中未捕获异常
- I/O 错误(实际写入磁盘失败,例如磁盘已分离或其他 OS / 硬件故障)
- 超出配额
- 用户代理崩溃
属性
IDBTransaction.db
只读
与此事务关联的数据库连接。
IDBTransaction.error
只读
返回 DOMException
,指示事务失败时发生的错误类型。如果事务未完成,已完成并成功提交,或者已使用 IDBTransaction.abort
函数中止,则此属性为 null
。
IDBTransaction.mode
只读
用于隔离对象存储中数据访问的模式,该对象存储在事务范围内。有关可能的值,请参阅下面的 “常量” 部分。默认值为 readonly
。
IDBTransaction.objectStoreNames
只读
返回 IDBObjectStore
对象名称的 DOMStringList
。
方法
从 EventTarget
继承了方法。
IDBTransaction.abort
将所有与此事务关联的数据库中对象的更改回滚。如果此事务已中止或已完成,则此方法将引发错误事件。
IDBTransaction.objectStore
返回表示对象存储的 IDBObjectStore
对象,该对象存储是此事务范围的一部分。
IDBTransaction.commit
对于活动事务,提交事务。
事件
使用 addEventListener()
或通过为此接口的 oneventname
属性分配事件监听器来监听这些事件:
abort
当 IndexedDB
事务中止时触发。
也可以通过 onabort
` 属性处理。
complete
事务成功完成时触发。
也可以通过 oncomplete
` 属性处理。
error
当请求返回错误并且事件冒泡到事务对象时触发。也可以通过 onerror
属性处理。
模式常量
已废弃 Gecko 13 (Firefox 13 / Thunderbird 13 / SeaMonkey 2.10)
该特性已经从 Web 标准中删除,虽然一些浏览器目前仍然支持它,但也许会在未来的某个时间停止支持,请尽量不要使用该特性。
这些常量不再可用 - 它们已在 Gecko 25 中删除。您应该直接使用字符串常量。 (Mozilla bug 888598)
事务可以有以下三种模式之一:
常量 | 值 | 描述 |
---|---|---|
READ_ONLY |
"readonly" (Chrome 中为 0) |
允许读取但不更改数据。 |
READ_WRITE |
"readwrite" (Chrome 中为 1) |
允许读取和写入现有数据存储中的数据以进行更改。 |
VERSION_CHANGE |
"versionchange" (Chrome 中为 2) |
允许执行任何操作,包括删除和创建对象存储和索引的操作。此模式用于更新使用 IDBDatabase 对象的 setVersion() 方法启动的事务的版本号。此模式的事务不能与其他事务同时运行。此模式下的事务称为 “升级事务”。 |
即使现在不推荐使用这些常量,如果需要,您仍然可以使用它们来提供向后兼容性(在 Chrome 中,在版本 21 中进行了更改)。如果对象不再可用,您应该进行防御性编码:
var myIDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || { READ_WRITE: "readwrite" };
实例
在下面的代码片段中,我们在数据库上打开一个读/写事务,并将一些数据添加到对象库。另外要注意附加到事务事件处理程序的函数,以便在成功或失败时报告事务打开的结果。有关完整的工作实例,请参阅我们的待办事项通知应用程序(查看在线实例。)
// 让我们打开数据库
var DBOpenRequest = window.indexedDB.open("toDoList", 4);
DBOpenRequest.onsuccess = function(event) {
note.innerHTML += '<li>数据库已初始化。</li>';
// 存储在 db 变量中打开数据库的结果。这在后续会多处使用。
db = DBOpenRequest.result;
// 将数据添加到数据库
addData();
};
function addData() {
// 创建要插入 IDB 的新对象
var newItem = [ { taskTitle: "遛狗", hours: 19, minutes: 30, day: 24, month: "December", year: 2013, notified: "no" } ];
// 打开读/写 db 事务,准备添加数据
var transaction = db.transaction(["toDoList"], "readwrite");
// 报告成功开启事务
transaction.oncomplete = function(event) {
note.innerHTML += '<li>事务完成:数据库修改完成。</li>';
};
transaction.onerror = function(event) {
note.innerHTML += '<li>事务因错误未被开启。不允许重复的项目。</li>';
};
// 在事务上创建一个对象存储
var objectStore = transaction.objectStore("toDoList");
// 将我们的 newItem 对象添加到对象库
var objectStoreRequest = objectStore.add(newItem[0]);
objectStoreRequest.onsuccess = function(event) {
// 报告请求的成功
//(这并不意味着该项已成功存储在数据库中 - 因为您需要等待 transaction.oncomplete)
note.innerHTML += '<li>请求成功。</li>';
};
};
规范
规范 | 状态 | 备注 |
---|---|---|
Indexed Database API IDBTransaction 的定义 |
推荐 | 初始定义 |
Indexed Database API 2.0 IDBTransaction 的定义 |
编者的草案 | - |
Unknown IDBTransaction 的定义 |
Unknown | 引入了 IDBTransaction.commit 方法。 |
桌面浏览器兼容性
特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基础支持 | 24 23 — 57 webkit | 支持 | 16 10 — 16 moz | 101 | 15 | 7 |
Available in workers | 支持 | 未知 | 37 | 未知 | 支持 | 未知 |
db | 24 23 — 57 webkit | 12 | 16 10 — 16 moz | 101 | 15 | 7 |
error | 24 23 — 57 webkit | 12 | 16 10 — 16 moz | 101 | 15 | 7 |
mode | 24 23 webkit | 12 | 16 10 — 16 moz | 101 | 15 | 7 |
objectStoreNames | 48 | 未知 | 支持 | 未知 | 35 | 未知 |
onabort | 24 23 webkit | 12 | 16 10 — 16 moz | 101 | 15 | 7 |
oncomplete | 24 23 webkit | 12 | 16 10 — 16 moz | 101 | 15 | 7 |
onerror | 24 23 webkit | 12 | 16 10 — 16 moz | 101 | 15 | 7 |
abort | 24 23 webkit | 12 | 16 10 — 16 moz | 101 | 15 | 7 |
objectStore | 24 23 webkit | 12 | 16 10 — 16 moz | 101 | 15 | 7 |
移动浏览器兼容性
特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
基础支持 | 24 23 — 57 webkit | 24 23 — 57 webkit | 支持 | 22 | 未知 | 22 | 8 |
Available in workers | 支持 | 支持 | 支持 | 37 | 未知 | 支持 | 未知 |
db | 24 23 — 57 webkit | 24 23 — 57 webkit | 支持 | 22 | 未知 | 22 | 8 |
error | 24 23 — 57 webkit | 24 23 — 57 webkit | 支持 | 22 | 未知 | 22 | 8 |
mode | 支持 | 支持 | 支持 | 22 | 未知 | 22 | 8 |
objectStoreNames | 48 | 48 | 未知 | 未知 | 未知 | 35 | 未知 |
onabort | 支持 | 支持 | 支持 | 22 | 未知 | 22 | 8 |
oncomplete | 支持 | 支持 | 支持 | 22 | 未知 | 22 | 8 |
onerror | 支持 | 支持 | 支持 | 22 | 未知 | 22 | 8 |
abort | 支持 | 支持 | 支持 | 22 | 未知 | 22 | 8 |
objectStore | 支持 | 支持 | 支持 | 22 | 未知 | 22 | 8 |
1. 部分的
相关链接
- 使用 IndexedDB
- 启动事务:
IDBDatabase
- 使用事务:
IDBTransaction
- 设置一系列键:
IDBKeyRange
- 检索并更改数据:
IDBObjectStore
- 使用游标:
IDBCursor
- 参考实例:To-do 通知 (在线查看实例。)