1

我有以下代码:

transaction = db.transaction("myStore", "readwrite");
objStore = transaction.objectStore(myStore);
Index = objStore.index(key);
request = Index.openCursor(field);
request.onsuccess = function(event) {
  var cursor = event.target.result;
  if (cursor) {
    request = objStore.delete(cursor.value.key);
    request.onsuccess = function(event) {
      console.log("delete successful");
      return;
    };

交易范围是“myStore”。
我可以继续引用事务以使其保持活动状态,以便递归删除返回的游标数据。

这是否意味着因为它始终是同一个事务,所以删除数据的任何问题都会回滚所有已删除的事务?

4

1 回答 1

2

事务确保为获得一致状态而需要发生的几个操作是成功的。如果一个失败,意味着你会得到一个不一致的状态,它需要回滚到原始状态。举个具体的例子。如果您将资金从一个帐户转移到另一个帐户,则只有在两个余额中的某些余额相同的情况下,您才能拥有一致的状态。这意味着当一个值从一个帐户中重新提取时,必须将其添加到另一个帐户才能获得一致的状态。如果两者之一失败,则交易将恢复到原始状态。

因此,为了性能或其他目的而保持事务处于活动状态并不是一个好的选择。在 indexeddb API 中,事务也是自动提交的。这意味着当事务不包含任何操作或处于非活动状态时,它将提交更改。

作为最后一点,你的问题。如果在同一事务中删除失败,则在同一事务中执行的所有删除都将回滚。如果您不希望这种行为,您将需要创建多个事务。

于 2013-02-02T13:22:17.943 回答