【问题标题】:How to do batched writes as part of a transaction如何将批处理写入作为事务的一部分
【发布时间】:2020-07-18 11:33:24
【问题描述】:

我发现自己处于一种情况,我想对数据库执行一些应该在单个事务中处理的操作。其中一项操作是注入 > 500 个文档,因此会引发错误,因为它正在命中

每个请求最多允许 500 次写入

为了解决这个问题,您可以使用批处理写入,但我不知道如何将批处理写入作为事务的一部分。似乎transaction.commit() 不是一个东西,在文档中事务和批量写入似乎是两个独立的概念。

【问题讨论】:

  • 批次和交易均受 500 个文档上限的约束。他们都在本质上试图“提交”一些文件。不同之处在于事务首先尝试读取文档以更改现有内容,而批量写入只是写入。事务只能在线工作,因为它们需要与服务器的连接,但批量写入可以离线工作,因为它们只包含要应用的增量列表,而与现有内容无关。

标签: firebase google-cloud-firestore


【解决方案1】:

一般来说,我们使用事务来获得一致的数据。您得到的建议:

你可以使用批量写入

出于完全相同的原因。不幸的是,你不能混合它们。你必须选择其中之一。现实地说,批处理和事务都用于原子更新。

事务类似于批处理,正如docs 所述:

所有操作都成功,或者没有一个被应用。

批量写入和事务之间的主要区别在于,批量只写入,而事务读取,然后再写入。

因此,您的解决方案是使用Firestore batched-writes 一次执行 500 次操作。

【讨论】:

  • 谢谢亚历克斯。这似乎是解决方案。在我的情况下,只有写操作才是相关的。它们跨越两个不同的集合,但这对于批量写入来说不是问题。
  • 哦,也许不是……“所有操作都成功了,或者没有一个被应用。”只适用于一批。我有 500 多个文档,因此我需要提交多个批次。如果一个失败,我无法恢复前一批的提交。似乎这对于当前的 Firestore API 是不可能的。
  • 是的,它只适用于一个批次。如果您有超过 500 个文档,您应该为此创建自己的机制。没错,我可以确认也没有恢复上一批的机制。
  • 我会接受这个答案。这不是我的解决方案,但目前显然没有。
【解决方案2】:

正如您很可能在doc 中看到的那样:

Transaction 对象传递给事务的 updateFunction 提供在事务中读取和写入数据的方法 上下文。

在客户端 SDK 中,此对象只有四种方法:get()set()update()delete(),它们都将单个 Firestore 文档作为参数。

使用Node.js Server SDK for Google Cloud Firestore,您会注意到还有一个附加方法getAll(),它“从Firestore 检索多个文档。对所有返回的文档持有悲观锁定”。


因此,在撰写本文时,不可能“混合”事务和批量写入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2015-01-19
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    相关资源
    最近更新 更多