,Tx是犯罪:IndexedDB的交易自动提交的边缘情况的行为
- 请求成功回调函数返回 - 这意味着多个请求只能当一个请求是从成功回调执行事务边界内执行前一个
- 当你的任务返回到事件循环
这意味着,如果没有请求提交给它,它不承诺,直到它返回到事件循环。通过
- 放置一个新的IDB的要求从以前的请求的成功回调内排队一个新的任务事件循环队列,而不是在这种情况下,提交新的要求同步
- :这些事实造成2个问题的状态第一次成功回调立即返回,但另一个IDB请求已计划
- 是在单个初始事务中执行的所有异步请求吗?这是在情况十分必要要实现的结果与背压拉动地方消费让你在未来的形式的反馈,这是准备消费的另一响应
- :这些事实造成2个问题的状态第一次成功回调立即返回,但另一个IDB请求已计划
- 创建读写TX,不在返回事件循环之前放置任何请求并创建另一个请求
- 确实创建了一个隐含地提交了前一个tx?如果不是这样,可能会出现严重写锁STARVATIONS,因为:
如果有多个“读写”交易正试图访问同一 对象存储(即如果他们有重叠的范围),交易 首先创建的事务必须是首先访问对象存储的 的事务。由于前面的 段落中的要求,这也意味着它是唯一具有 访问对象库的事务,直到事务完成。
的通过递归请求提交与背压从成功回调内排队一个新的任务事件循环队列的例子:
function recursiveFn(key) {
val req = store.get(key)
req.onsuccess = function() {
observer.onNext(req.result).onsuccess { recursiveFn(nextKey) }
}
}
Observer#onNext // returns Future[Ack] Ack is either Continue or Cancel
现在可以onsuccess
或onNext
做的setTimeout(0 )还是不让整个事情成为一个交易的一部分?
奖金的问题:
我认为只读事务暴露给消费者/用户,只是因为它是很难检测一个批次的读取结束,如果你递归地从先前的成功回调提出的新要求一个权利?否则,我不认为有任何其他原因让他们接触到用户,对吧?
您可以添加适当的链接到indexeddb规范吗? – 2014-12-06 00:56:57
我没有,这是从我的头上,并从过去数周的IndexedDb强烈体验。 – lisak 2014-12-06 00:58:32
Btw的IndexedDb开发人员在这里回答了很多http://stackoverflow.com/q/10385364/306488 – lisak 2014-12-06 01:10:41