IDBTransaction - 为数据库提供静态异步事务

IDBTransactionIndexedDB API 的接口,使用事件处理程序属性为数据库上提供静态异步事务。所有数据的读写都是在事务中完成的。实际上,您使用 IDBDatabase 来启动事务,使用 IDBTransaction 来设置事务的模式(例如,它是 readonlyreadwrite),并访问 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 / 硬件故障)
  • 超出配额
  • 用户代理崩溃
注意: 此特性在 Web Worker 中可用。

属性

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 方法。

桌面浏览器兼容性

特性ChromeEdgeFirefoxInternet ExplorerOperaSafari
基础支持

24

23 — 57 webkit

支持

16

10 — 16 moz

101157
Available in workers 支持 未知37 未知 支持 未知
db

24

23 — 57 webkit

12

16

10 — 16 moz

101157
error

24

23 — 57 webkit

12

16

10 — 16 moz

101157
mode

24

23 webkit

12

16

10 — 16 moz

101157
objectStoreNames48 未知 支持 未知35 未知
onabort

24

23 webkit

12

16

10 — 16 moz

101157
oncomplete

24

23 webkit

12

16

10 — 16 moz

101157
onerror

24

23 webkit

12

16

10 — 16 moz

101157
abort

24

23 webkit

12

16

10 — 16 moz

101157
objectStore

24

23 webkit

12

16

10 — 16 moz

101157

移动浏览器兼容性

特性AndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
基础支持

24

23 — 57 webkit

24

23 — 57 webkit

支持22 未知228
Available in workers 支持 支持 支持37 未知 支持 未知
db

24

23 — 57 webkit

24

23 — 57 webkit

支持22 未知228
error

24

23 — 57 webkit

24

23 — 57 webkit

支持22 未知228
mode 支持 支持 支持22 未知228
objectStoreNames4848 未知 未知 未知35 未知
onabort 支持 支持 支持22 未知228
oncomplete 支持 支持 支持22 未知228
onerror 支持 支持 支持22 未知228
abort 支持 支持 支持22 未知228
objectStore 支持 支持 支持22 未知228

1. 部分的

相关链接