- IndexedDB 教程
- IndexedDB - 首页
- IndexedDB - 简介
- IndexedDB - 安装
- IndexedDB - 连接
- IndexedDB - 对象存储
- IndexedDB - 创建数据
- IndexedDB - 读取数据
- IndexedDB - 更新数据
- IndexedDB - 删除数据
- 使用 getAll() 函数
- IndexedDB - 索引
- IndexedDB - 范围
- IndexedDB - 事务
- IndexedDB - 错误处理
- IndexedDB - 搜索
- IndexedDB - 游标
- IndexedDB - Promise 包装器
- IndexedDB - ECMAScript 绑定
- IndexedDB 有用资源
- IndexedDB - 快速指南
- IndexedDB - 有用资源
- IndexedDB - 讨论
IndexedDB - 事务
事务是一组操作,这些操作应该全部成功或全部失败。例如,如果我们通过 UPI 向商家付款,而交易失败,则资金必须退回到发送者的帐户。事务维护这种完整性。
以下是打开事务的语法:
db.transaction(store[, type]);
这里的 store 是我们想要进行事务的对象存储。事务的类型有两种:
只读 - 只能读取,默认情况下提供。
读写 - 我们只能读取和写入数据,但不能从对象存储中创建、删除或更改数据。
事务生命周期
事务是在对象存储之间执行任何操作的连接。每个事务都有一个状态,可以是:
活动 - 当事务首次创建时,或当请求与事务关联时。当事务处于此状态时,可以针对事务发出新的请求。
非活动 - 事务在其创建后控制返回到事件后处于此状态。当事务处于此状态时,不能针对事务发出任何请求。
提交中 - 一旦与事务关联的所有请求都完成,它就会尝试提交。在提交状态期间,无法发出新的请求。
已完成 - 事务提交或中止后,它处于已完成状态。在已完成状态期间,无法发出新的请求。
事务的生命周期
形成了具有范围和模式的事务。事务在生成时最初处于活动状态。
要开始事务,实现必须排队一个任务。
当处理与事务相关的每个请求时,将触发成功或错误事件。当发送事件时,事务状态设置为活动状态,允许针对事务发出后续请求。事件调度完成后,事务的状态设置为非活动状态。
即使事务当前未处于活动状态或尚未开始,也可以在完成之前随时取消事务。
当针对数据库发出的所有请求都成功时,实现必须尝试提交事务。
当事务提交或中止时,其状态将设置为完成。
事务调度
事务可以启动时,有一些限制。
当没有读或写事务时:a. 在事务 tx 之前建立;b. 与 tx 具有重叠的范围;c. 不处于最终状态,只读事务 tx 可以开始。
当没有其他事务时,可以开始读/写事务 tx:
- 在 tx 之前形成的,
- 与 tx 具有重叠的范围,或
- 未处于已完成状态。
升级事务
模式为“versionchange”的事务是升级事务。
可以使用升级操作创建、重命名和删除数据库中的对象存储和索引。
如果给定大于当前版本的版本,则在完成打开数据库连接后的运行升级事务的步骤后,会自动生成升级事务。在此事务将在 upgradeneeded 事件处理程序中处于活动状态。
提交事务
必须完成以下步骤才能提交事务:
- 事务状态首先设置为提交中。
- 等待列表中所有事务请求都已处理。
- 如果发生错误,则中止事务。
- 如果事务是升级事务,则将数据库升级事务的事务连接设置为 NULL。
- 将事务状态更改为已完成。
- 触发事务的完整事件
- 如果事务是升级事务,则将请求的事务设置为 null,并发出与事务关联的请求。
语法
transaction.commit()
尝试提交事务。所有挂起的请求都将允许完成,但不会接受新的请求。
如果挂起的请求失败,则事务将中止。成功请求的成功事件仍将触发,但在事件处理程序中抛出异常不会中止调用 preventDefault() 的事务将不会阻止事务中止。
事件处理程序
各种事件处理程序属性如下:
attribute EventHandler onabort; attribute EventHandler oncomplete; attribute EventHandler onerror;
事务示例
下面给出一个简单的 JavaScript 程序来演示事务的使用:
<!DOCTYPE html> <html lang="en"> <head> <title>Document</title> </head> <body> <script> const request = indexedDB.open("botdatabase",1); request.onupgradeneeded = function(){ const db = request.result; const store = db.createObjectStore("bots",{ keyPath: "id"}); } request.onsuccess = function(){ document.write("database opened successfully"); const db = request.result; const transaction=db.transaction("bots","readwrite"); const store = transaction.objectStore("bots"); store.add({id: 1, name: "jason",branch: "IT"}); store.add({id: 2, name: "praneeth",branch: "CSE"}); store.add({id: 3, name: "palli",branch: "EEE"}); store.add({id: 4, name: "abdul",branch: "IT"}); store.put({id: 4, name: "deevana",branch: "CSE"}); transaction.oncomplete = function(){ document.write("transaction complete"); db.close; }; } </script> </body> </html>
输出
database opened successfully transaction complete
此处创建事务,只有在创建事务后,我们才能将数据添加到对象存储中,最后在事务完成后,我们关闭数据库。
示例
以下示例显示了事务属性 oncomplete 的用法:
function student(db, names) { let transaction = db.transaction(['names'], 'readwrite'); let store = transaction.objectStore('names'); for (let i = 0; i < messages.length; i++) { store.add({text: names[i]}); } transaction.oncomplete = function() {document.write('transaction complete')}; }
中止事务
要中止事务,请按照以下步骤操作:
撤消对数据库的所有与事务相关的修改。
在升级事务期间,对象存储、索引和版本的更改也会被还原。
完成事务状态。
如果错误不为空,则将事务错误设置为错误。
将请求处理标志设置为事务请求列表中每个请求为 true。
将请求完成标志设置为 true,并将结果设置为定义。
如果事务是升级事务,则将与事务连接关联的升级事务设置为 null。
创建一个中止事务事件,并将 bubbles 属性设置为 true。
如果事务是升级事务,则假设请求是事务的打开请求。