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

ano*_*ous 12 indexeddb

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

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

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

小智 27

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

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

一旦停止对事务发出请求并且最后一个请求回调结束,事务就会自动关闭.

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

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

  • 感谢您的加入 - 很棒的让IDB规范作家闲逛 (5认同)

bul*_*ley 8

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

我从Jonas Sicking那里获取了我的交易信息,Jonas Sicking是一个关于IndexedDB的Mozilla开发者和合作编写者,他对这篇优秀的博客文章发表评论说:

以下句子不正确"当事务变量超出范围并且不再对其提出请求时,今天的事务自动提交".

当变量超出范围时,事务永远不会自动提交.通常,它们仅在最后一次成功/错误回调触发时提交,并且该回调不再调度请求.所以它与任何变量的范围无关.

唯一的例外是如果您创建一个事务但没有对它发出请求.在这种情况下,只要您返回到事件循环,事务就会"提交"(无论对于没有请求的事务,这意味着什么).在这种情况下,只要对所有引用都超出范围,您就可以在技术上"提交"事务,但这不是一个特别有趣的用例来进行优化.