事务范围如何与`openCursor()`一起使用?

时间:2013-02-01 21:30:15

标签: transactions indexeddb

我有以下代码:

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” 我可以继续引用事务来保持它alive,以便我可以递归地删除返回的游标数据。

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

1 个答案:

答案 0 :(得分:2)

事务确保为获得一致状态而需要执行的多个操作都是成功的。如果一个失败,意味着你将获得一个不一致的状态,它需要回滚到原始状态。用一个具体的例子。如果您将资金从一个帐户转移到另一个帐户,如果两个余额中的某些余额相同,则您只能拥有一致的状态。表示从一个帐户重绘值时,必须将其添加到另一个帐户以获得一致状态。如果其中一个失败,则事务将返回到原始状态。

因此,为了表现或其他事情保持交易活着不是一个好的选择。同样在indexeddb API中,事务是自动提交的。意味着当事务不包含任何操作或变为非活动状态时,它将提交更改。

最后一点是要解决你的问题。如果在同一事务中删除失败,则在同一事务中执行的所有删除都将回滚。如果您不想要此行为,则需要创建多个事务。