【问题标题】:Firestore Batched Writes operations sequence guaranteeFirestore 批量写入操作顺序保证
【发布时间】:2019-11-22 10:42:47
【问题描述】:

批量写入中的操作是否保证按照调用顺序执行?根据the docs 不清楚。是否强制只有 (#0) -> (#1) -> (#2) 而不是其他方式?

const batch = db.batch();

const nycRef = db.collection('cities').doc('NYC');
batch.set(nycRef, {name: 'New York City'}); // (#0)

const sfRef = db.collection('cities').doc('SF');
batch.update(sfRef, {population: 1000000}); // (#1)

const laRef = db.collection('cities').doc('LA');
batch.delete(laRef); // (#2)

return batch.commit().then(function () {
  // ...
});

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    批次中的更改没有顺序。它们一次以原子方式发生,或者根本不发生。任何客户端都无法查看包含不完整批次的数据库。

    适用于该批次文档的任何安全规则都将看到所有文档同时更改。安全规则按顺序应用于单个文档。如果您在安全规则中使用 getAfter() 来获取从批处理中更改的文档的内容,则每次调用 getAfter() 都只会看到新数据。

    从不存在从批次更新的文档看起来不完整的中间状态。

    如果您在文档上有任何可以批量更新的 Cloud Functions 触发器,则没有定义的执行顺序 - 它们可以同时执行,或者以某种明显的“随机”顺序执行。

    【讨论】:

    • 太棒了!谢谢你。现在我懂了。很高兴在文档中看到这一点。
    • 当文档说“以原子方式完成”时,这意味着批次完成时没有排序。无论如何,如果您发现文档可以改进,您可以使用任何页面右上角的“发送反馈”链接来解释您发现不清楚的地方。
    【解决方案2】:

    正如文档中提到的那样:

    一批写入原子完成,可以写入多个文档。

    据此,我理解(我认为理论上应该是这样),来自同一批次的操作应该在同一时间发生,作为一个单一的。原子地。

    编辑 Here 有一篇关于批量写入如何工作的有趣文章。当您执行提交时,所有的写入都会同时执行(理论上,实际上是不可能的)。当状态完成并且提交准备好时,应该修改集合。通常,默认情况下,在批量写入中,您不能依赖它们实际执行的顺序。例如,对于 MongoDB,我知道有一些方法可以保留顺序(默认情况下不会发生的事情)。我无法为 Firestore 找到类似的东西,所以我想说,默认情况下,您不应该依赖批次中操作的最终顺序。

    【讨论】:

    • “原子性”是关于“全有或全无”,而不是关于操作顺序。我有一些操作应该只按特定顺序执行。现在我在没有“批处理”的情况下使用它们,但我想“批处理”在这里可能有用。
    • 我已经编辑了我的答案,以更好地解释我想说的话。
    • 是的,你是对的。 “原子性”是这里的关键点,这意味着无法保留操作的顺序。这只是一个可观察的操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2018-07-04
    • 1970-01-01
    相关资源
    最近更新 更多