7

My code is like the following:

...
var f1 = function(trans) {
  var store = trans.objectStore('ObjectStore');
  store.clear();
};
var f2 = function(trans) {
  var store = trans.objectStore('ObjectStore');
  store.add({id: 1, data: 'text'});
};
...
var trans = DB.connection.transaction(['ObjectStore'], IDBTransaction.READ_WRITE);
trans.onerror = function() { alert('ERROR'); };
trans.oncomplete = function() { alert('DONE'); };
...

The problem us that i get the DONE alert right after clear and on the second request exception appears.

Is it possible to "reuse" the transaction in IndexedDB?

UPD: I've found that the code above works as I expect in the latest Chromium nightly build.

4

1 回答 1

5

根据Mozilla 开发人员和 IndexedDB 的共同规范编写者 Jonas Sicking 的说法,事务在最后一次回调触发时提交。因此,要保持事务处于活动状态,您应该能够通过连续回调重用它。

您在oncomplete上面使用,但onsucess也应该同样有效。

您可以将事务对象作为回调返回的请求对象的属性来查找。

以下句子不正确“当事务变量超出范围并且不能再针对它放置更多请求时,今天的事务会自动提交”。

当变量超出范围时,事务永远不会自动提交。通常,它们仅在最后一个成功/错误回调触发并且该回调不再安排更多请求时提交。所以它与任何变量的范围无关。

唯一的例外是,如果您创建了一个事务但没有对它提出任何请求。在这种情况下,只要您返回事件循环,事务就会“提交”(无论这对于没有请求的事务意味着什么)。在这种情况下,只要对事务的所有引用超出范围,您就可以在技术上“提交”事务,但这并不是一个特别有趣的优化用例。

根据下面的规范示例,您应该能够在 找到事务对象evt.transaction,并且可以进行新事务并添加新的onsuccess事件侦听器。

 var request = indexedDB.open('AddressBook', 'Address Book');
 request.onsuccess = function(evt) {...};
 request.onerror = function(evt) {...};
于 2012-05-07T18:14:20.717 回答