如何使indexeddb事务保持活动状态?

时间:2012-04-30 14:27:13

标签: indexeddb

只要您使用适当的IDBTransaction,就可以从单个事务中完成所有操作,而不是打开多个事务(读取表,写入表,写入另一个表等)?

Mozilla说:“保持事务处于活动状态的唯一方法是对其发出请求。当请求完成后,您将获得一个DOM事件,并且假设请求成功,您将有另一个机会在回调期间扩展交易。“这有点模糊。这是否意味着如果我为DOM回调提供一个事件处理程序,我可以在该回调中的任何一点使用该事务,而不必担心该事务被关闭?

https://developer.mozilla.org/en/IndexedDB/Using_IndexedDB#Adding_data_to_the_database

4 个答案:

答案 0 :(得分:27)

简短回答:如果您为“成功”或“错误”事件提供事件处理程序,则可以在该事件处理程序中放置新请求,而不必担心事务会自动关闭。

答案很长:交易提交通常应该完全透明。唯一的规则是,在执行非数据库“东西”时,您无法保持事务处于打开状态。即您无法启动事务,然后在执行某些XMLHttpRequests时或在等待用户单击按钮时将其保持打开状态。

只要您停止对某个交易发出请求并且上一个请求回调完成,该交易就会自动关闭。

但是,您可以启动一个事务,使用该事务读取一些数据,然后写一些结果。

因此,请确保在启动事务之前拥有所需的所有数据,然后执行要在请求回调中执行的所有读取和写入操作。完成后,交易将自动完成。

答案 1 :(得分:7)

一旦最后一个回调被触发,IndexedDB事务就会提交,所以保持它们存活的方法是通过回调传递它们。

我从Jonas Sicking那里获取了我的交易信息,Jonas Sicking是一个关于IndexedDB的Mozilla开发者和合作编写者,他对this excellent blog post发表评论说:

  

以下句子不正确"今天的交易自动提交   当事务变量超出范围而没有更多请求时   可以反对它"。

     

当变量消失时,事务永远不会自动提交   范围。通常它们只在最后一次成功/错误回调时提交   触发并且回调计划不再需要。所以不是   与任何变量的范围有关。

     

唯一的例外是如果您创建了一个事务但是没有   要求反对它。在这种情况下,交易是"已提交"   (对于没有请求的交易,这意味着什么)   当你返回事件循环。在这种情况下你可以   技术上"承诺"所有引用它的交易   超出范围,但它不是一个特别有趣的用例   优化

答案 2 :(得分:1)

简短回答:不要保留。

为了防止竞争条件,IndexedDB是为隐式提交而设计的,因此您不能显式保持事务处于活动状态。如果需要,请更改算法,使其不需要保持活动状态。

重用事务以提高性能并执行有序请求。在这些情况下,交易将隐含地保持活力。

答案 3 :(得分:0)

要使事务保持活动状态,请继续执行完整操作的回调中的下一个操作。请参阅以下示例代码。

function put_data(db,tableName,data_array)
{
    var objectStore=db.transaction([tableName],"readwrite").objectStore(tableName);
    put_record(data_array,objectStore,num_rows,0);
}

function put_record(data_array,objectStore,row_index)
{
    if(row_index<data_array.length)
    {
        var req=objectStore.put(data_array[row_index]);
        req.onsuccess=function(e)
        {
            row_index+=1;
            put_record(data_array,objectStore,row_index);
        };
        req.onerror = function()
        {
            console.error("error", this.error);
            row_index+=1;
            put_record(data_array,objectStore,row_index);
        };
    }
}