Transactions 事务作用域如何与“openCursor()”一起工作?

Transactions 事务作用域如何与“openCursor()”一起工作?,transactions,indexeddb,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

我有以下代码:

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


这是否意味着,由于整个事务都是相同的,因此删除数据时出现的任何问题都会回滚所有已删除的事务

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

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

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