【问题标题】:Difference between firestore transactions and FieldValue.increment when updatiing a counter on firestore更新 Firestore 上的计数器时,Firestore 事务和 FieldValue.increment 之间的区别
【发布时间】:2019-11-01 07:02:25
【问题描述】:

我知道之前有人问过这个问题,并且 firebase 官方文档也表明这两者具有完全相同的效果。

但是,由于一些原因,我在将两者视为相同时感到困惑:

  1. 交易会自动在中止时重试,而文档中没有提到 FieldValue.increment() 的作用相同。
  2. 如文档中所述 Firestore 文档的最大写入速率是每秒一次写入,因此使用 FieldValue.increment() 不能超过每秒一次更新单个计数器。但是文档没有提到的是 在这种情况下会发生什么? 例如,如果 FieldValue.increment() 在一秒钟内被调用两次,那么对 FieldValue.increment() 的第二次调用是否完全失败,或者它被阻塞直到一秒钟过去,然后在那之后或其他事情发生后被执行。
  3. 如果用于更新同一个计数器的两个相同事务由两个不同的客户端同时运行,其中一个事务会被中止并重试吗?

考虑到以上几点,我认为事务更新计数器更安全,特别是在多个客户端可以更新单个计数器的情况下,因此如果上述假设为真,FieldValue.increment() 将在两个或更多客户端尝试在一秒钟内更新计数器。但是对事务做同样的事情将有一个优势,即由于并发而在中止时自动重试。

所以我想知道的是我的假设是否正确?如果不是,那么以上三件事究竟是通过什么方式完成的?还考虑到多个用户更新单个计数器的示例,使用事务而不是 FieldValue.increment() 是否有优势。

【问题讨论】:

    标签: firebase google-cloud-firestore concurrency transactions


    【解决方案1】:
    1. 与事务不同,客户端和服务器之间的冲突增量操作不需要往返。那是因为客户端不需要重新计算新值。服务器很清楚,它只是单个文档的现有字段的增量,它可以在内部自行重试。

    2. 如果超出限制,写入操作将失败,就像任何其他超出限制的写入操作一样。在这方面,增量没有什么特别之处。请记住,对文档进行两次快速更改不一定会彻底失败。每秒 1 次更改的限制是持续限制。该系统可以在短时间内处理一些快速变化,但这不能无限期地持续下去。同样,这适用于所有写入,而不仅仅是增量。

    3. 不,每个事务将独立驱动创建。是否有任何“相同”的交易(无论您以何种方式定义)都没有关系。

    如果您所做的只是更新单个文档,那么使用事务而不是增量没有任何优势。但是,如果您有跨多个必须是原子的文档的更新,则需要使用事务。

    【讨论】:

    • 感谢@Doug Stevenson,清除了我脑海中的大部分歧义。
    猜你喜欢
    • 2021-03-24
    • 2018-09-26
    • 1970-01-01
    • 2021-04-19
    • 2020-08-01
    • 1970-01-01
    • 2022-01-17
    • 2018-03-14
    • 1970-01-01
    相关资源
    最近更新 更多