ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 第七节:IDBTransaction 对象 `IDBTransaction` 对象用来异步操作数据库事务,所有的读写操作都要通过这个对象进行。 `IDBDatabase.transaction()`方法返回的就是一个`IDBTransaction`对象。 ~~~ var db; var openRequest = window.indexedDB.open('demo', 1); openRequest.onsuccess = function(event) { db = openRequest.result; var transaction = db.transaction(['demo'], 'readwrite'); transaction.oncomplete = function (event) { console.log('transaction success'); }; transaction.onerror = function (event) { console.log('transaction error: ' + transaction.error); }; var objectStore = transaction.objectStore('demo'); var objectStoreRequest = objectStore.add({ foo: 1 }); objectStoreRequest.onsuccess = function (event) { console.log('add data success'); }; }; ~~~ 事务的执行顺序是按照创建的顺序,而不是发出请求的顺序。 ~~~ 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'); ~~~ 上面代码中,`key`对应的键值最终是`2`,而不是`1`。因为事务`trans1`先于`trans2`创建,所以首先执行。 注意,事务有可能失败,只有监听到事务的`complete`事件,才能保证事务操作成功。 `IDBTransaction` 对象有以下属性。 * `IDBTransaction.db`:返回当前事务所在的数据库对象`IDBDatabase`。 * `IDBTransaction.error`:返回当前事务的错误。如果事务没有结束,或者事务成功结束,或者被手动终止,该方法返回`null`。 * `IDBTransaction.mode`:返回当前事务的模式,默认是`readonly`(只读),另一个值是`readwrite`。 * `IDBTransaction.objectStoreNames`:返回一个类似数组的对象 DOMStringList,成员是当前事务涉及的对象仓库的名字。 * `IDBTransaction.onabort`:指定`abort`事件(事务中断)的监听函数。 * `IDBTransaction.oncomplete`:指定`complete`事件(事务成功)的监听函数。 * `IDBTransaction.onerror`:指定`error`事件(事务失败)的监听函数。 `IDBTransaction` 对象有以下方法。 * `IDBTransaction.abort()`:终止当前事务,回滚所有已经进行的变更。 * `IDBTransaction.objectStore(name)`:返回指定名称的对象仓库`IDBObjectStore`。