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

iswrvxsc  于 2023-11-15  发布在  IndexedDB
关注(0)|答案(4)|浏览(204)

只要使用适当的IDBTransaction,就可以从一个事务中完成所有这些操作,而不是打开多个事务(读一个表,写一个表,写另一个表等)?
Mozilla说:“保持事务活动的唯一方法是对其发出请求。当请求完成时,您将获得一个DOM事件,并且假设请求成功,你将有另一个机会在回调期间延长交易。”这是否意味着如果我为DOM回调提供一个事件处理程序,我可以在回调中的任何时候使用事务,而不必担心交易会被关闭吗
https://developer.mozilla.org/en/IndexedDB/Using_IndexedDB#Adding_data_to_the_database

dfuffjeb

dfuffjeb1#

简短的回答:如果为“成功”或“错误”事件提供事件处理程序,则可以在该事件处理程序中放置新请求,而不必担心事务会自动关闭。
详细回答:事务提交通常应该是完全透明的。唯一的规则是,你不能在做非数据库“东西”的时候保持事务打开。也就是说,你不能启动一个事务,然后在做一些XMLHttpRequest的时候保持它打开,或者在等待用户点击一个按钮的时候。
一旦您停止对事务发出请求,并且最后一个请求回调完成,该事务将自动关闭。
但是,您可以启动一个事务,使用该事务读取一些数据,然后写入一些结果。
因此,在开始事务之前,请确保您拥有所需的所有数据,然后在请求回调中执行您想要执行的所有读取和写入。一旦完成,事务将自动完成。

2mbi3lxu

2mbi3lxu2#

IndexedDB事务在最后一个回调被触发时立即提交,因此保持它们存活的方法是通过回调沿着传递它们。
我的交易信息来自Jonas Sicking,一位Mozilla开发人员和IndexedDB的共同规范作家,他对this excellent blog post发表了以下评论:
下面的句子是不正确的“Transactions today auto-commit when the transaction variable goes out of scope and no more requests can be placed against it”。
Transaction不会在变量超出作用域时自动提交。通常它们只会在最后一次成功/错误回调触发且该回调不再调度请求时提交。因此它与任何变量的作用域无关。
唯一的例外是,如果你创建了一个transaction,但是没有对它发出请求,在这种情况下,只要你返回到事件循环,transaction就被“提交”了(不管这对没有请求的transaction意味着什么)。在这种情况下,你可以在所有对它的引用都超出作用域时立即“提交”transaction,但是这不是一个特别有趣的优化用例。

llycmphe

llycmphe3#

简短的回答:不要保持。
为了防止竞争条件,IndexedDB是为隐式提交而设计的,因此您不能显式保持事务活动。如果需要,请更改您的算法,使其不需要保持活动。
为了性能和执行有序请求而重用事务。在这些情况下,事务将隐式地保持活动。

1aaf6o9v

1aaf6o9v4#

要保持事务活动,请从完整操作的回调中继续执行后续操作。请参考以下示例代码。

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);
        };
    }
}

字符串

相关问题