。事务是indexedDB
数据库中非常重要的一个概念,因为任何对于数据库中数据的读和修改的操作只能在事务中进行。
事务的创建
事务由IDBDatabase
对象调用其transaction
方法创建。
let IDBTransaction = IDBDatabase.transaction(storeNames, mode);
可以看出该方法接受两个参数:
- storeNames:就是在新的事务的作用域中的
objectStore
,生命成一组字符串数组的形式。意义在于指明用户希望访问的objectStore
。如果仅想访问一个objectStore
,那么仅需传入一个字符串而没必要传一个数组。
例如: let transaction = db.transaction('test1')
等价于let transaction = db.transaction(['test1'])
注:如果希望访问数据库中的所有objectStore
的话,可以直接传入IDBDatabase
对象的objectStoreNames
方法
- mode(可选):即事务运行的模式,模式共有3种,
readonly
、readwrite
、readwriteflush
(Firefox特有),默认值为readonly
。为了避免性能下降
,如果不是要对数据库写入数据就不要用readwrite
模式打开事务。
IDBTransaction对象
在调用完IDBDatabase
对象的transaction
方法之后,返回的值是一个IDBTransaction
对象。
属性
db
:当前事务所属的数据库error
:当存在一个不成功的事务时,这个属性会返回一个DOMException
来指示错误对象。当事务尚未完成、完成了且成功提交或者是手动调用abort
方法时,这个属性的值都为null
。mode
:事务的模式objectStoreNames
:返回创建事务时传入的objectStore
名。
事件
onabort
:这个事件当事务被终止时触发。oncomplete
:当事务被成功完成时触发onerror
:当事务没有被成功完成时触发
方法
abort
:放弃本次连接的事务的所有修改,若当前的事物处于回滚或完成状态时,则会抛出一个错误事件。objectStore
:返回该事务作用域内的objectStore
对象。若传入的参数不在作用域内则会报错。
多个事务的执行顺序
事务在被创建的时候就已经开始,而不是在发起第一个请求的时候,例如:
let trans1 = db.transaction("test1", "readwrite");
let trans2 = db.transaction("test1", "readwrite");
let objectStore2 = trans2.objectStore("test1")
let objectStore1 = trans1.objectStore("test1")
objectStore2.put({name: 'tom'}});
objectStore1.put({name: 'pat'});
可以看到"pat"在"tom"的前面。