2013-02-01 84 views
1

我有以下代码:事务范围如何与`openCursor()`一起工作?

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,这样我可以递归地删除返回的游标数据。

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

回答

2

事务处理确保为获得一致状态而需要发生的多个操作都是成功的。如果一个失败,意味着你会得到一个不一致的状态,它需要回滚到原来的状态。以一个具体的例子。如果您将资金从一个账户转移到另一个账户,那么只有两个余额中的一部分余额相同时,您才能拥有一致的状态。这意味着当一个帐户重新绘制值时,必须将其添加到其他帐户以获得一致的状态。如果其中一个失败,交易将返回到原始状态。

因此,保持一个交易活跃的表现或其他东西不是一个好的选择。同样在indexeddb API中,事务是自动提交的。当事务不包含任何操作时,或者处于不活动状态,它将提交更改。

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

+0

太棒了!谢谢! – user1460015