除了脱机可用性之外,批量写入比事务还有其他好处吗?

时间:2019-06-17 20:41:48

标签: firebase google-cloud-firestore google-cloud-functions

TL; DR

除脱机可用性之外,分批写入是否对交易有任何好处?
这是假设事务比批量写入更安全。

为什么要交易

我正在考虑将Cloud Functions代码从分批写入迁移到交易。最初的想法是,它会更安全
我担心批量写入失败时云功能将无法捕获,并且至关重要的是,实际上要应用所有写入(在不同集合中更改许多文档)。

read this answer很高兴听到以下消息:

  

如果您不需要或不想在离线状态下写东西,只需使用常规交易即可:它将处理您是否在线,如果离线则失败。您没有义务阅读交易中的任何内容。

这基本上表明批量写入的唯一要点是离线可用性。这证实了我的最初想法,但是,我也阅读了文档。

为什么要批量写入

"Transaction and batched writes" documentation指出,分批写入“失败案例少于事务”。

混乱

现在,我有些困惑。就我的情况而言,关于transaction failure的唯一有效担忧是:

  

交易记录读取了在交易记录之外修改的文档。在这种情况下,事务将自动再次运行。重试该交易次数。

由于我的Cloud Functions使用的写入操作完全是 update 操作,我想知道这是否适用于我的情况,即批量写入是否会遇到这样的问题?问题。按照我的想象,批量写入只会更新一千个文档,而所有这些更新仅会修改一个字段。

当事务执行相同操作时,何时会发生此故障?
而且由于我使用的是 Cloud Functions (我一直在线),所以批量写入是否会遇到任何问题?

+交易:更安全,不会失败
+批量写入:更少的失败案例,不会失败

您能看出我的困惑吗?
关于代码的简单性:我认为批处理写入看起来更加简洁,但是,就我而言,实际上是更多的代码。因此,对我来说没关系。

1 个答案:

答案 0 :(得分:0)

事务与批处理写入没有真正的可比性。您应该选择适合手头工作的工具。他们唯一的共同点是,当操作完成时,所有文档都将在同一时刻写入(它们是原子的)。它们也都可能由于违反安全规则而失败,就像来自客户端应用程序的任何其他操作一样。

这是您的决定方式:

批量写入

  • 离线工作,稍后将同步
  • 不关注任何当前文档值,无法安全地修改字段值
  • 不需要任何文档读取即可提交
  • 不会因为争用而失败,每次写入只会破坏同一文档上的先前写入

交易

  • 完全不能离线工作
  • 请注意当前文档值,可用于基于现有字段值安全地修改文档
  • 需要阅读文档才能编写更新
  • 由于交易中的文档争用过多,可能会失败