firebase - 更新 firestore 上的计数器时,firestore 事务和 FieldValue.increment 之间的区别

标签 firebase google-cloud-firestore concurrency transactions

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

但是,由于以下几点,我在将两者视为相同时感到困惑:

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

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

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

    最佳答案

  • 与事务不同,客户端和服务器之间不需要为冲突的增量操作进行往返。那是因为客户端不需要重新计算新值。服务器很清楚它只会增加单个文档的现有字段,并且它可以自己在内部重试。
  • 如果超过限制,写入操作将失败,就像任何其他超过限制的写入操作一样。在这方面,增量没有什么特别之处。请记住,对文档的两次快速更改不一定会彻底失败。每秒 1 次更改的限制是 持续限制。该系统可以在短时间内处理一些快速变化,但不能无限期地持续下去。同样,这适用于所有写入,而不仅仅是增量。
  • 不,每笔交易都将独立驱动到创建。是否有任何“相同”的交易(以您定义的任何方式)都没有关系。

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

    关于firebase - 更新 firestore 上的计数器时,firestore 事务和 FieldValue.increment 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56652419/

    相关文章:

    firebase - 如何从 Cloud Firestore 删除多个文档?

    javascript - 有没有办法将 firestore 搜索结果放入数组中?

    java - stub 的 gRPC 并发

    javascript - 使用 Firebase 实现无密码登录的最佳方式

    java - Firebase 身份验证 createUserWithEmailAndPassword 在具有电子邮件变量的物理设备上失败

    ios - Firebase 实时更新我关注的人的帖子

    java - Guava MultiMap 和 ConcurrentModificationException

    java - 查询 Google App Engine 数据存储区时出现并发问题

    android - INVALID_APP_CREDENTIAL :App validation failed, Firebase 身份验证

    arrays - 如何从 FireBase 访问嵌套的 NSDictionary 数据