【问题标题】:Firebase RTDB batched transactions (increment 2 values at the same time)Firebase RTDB 批处理事务(同时增加 2 个值)
【发布时间】:2019-08-27 07:24:25
【问题描述】:

我知道您可以使用 update 进行批量、原子的全部或全部更新 - 但您可以对事务执行相同的操作吗?

目前我正在尝试在接受好友请求的同时增加用户好友数(2 个用户)。

这是我正在做的工作,但如果出现问题,将导致多次出现错误的数据不一致。

  const upOneFriend = firebase
    .database()
    .ref("users")
    .child(friend.uid)
    .child("friendCount");
  const upOneCurrentUser = firebase
    .database()
    .ref("users")
    .child(userUid)
    .child("friendCount");
  upOneFriend
    .transaction(currentCount => {
      return currentCount + 1;
    })
    .then(() => {
      upOneCurrentUser.transaction(currentCount2 => {
        return currentCount2 + 1;
      });
    })
    .catch(() => {
      console.log("error increment");
    });

就像我说的,是可行的,但我需要同时这样做!我环顾四周,没有发现任何与实时数据库的批处理事务相关的内容。

干杯。

【问题讨论】:

    标签: node.js firebase firebase-realtime-database transactions atomic


    【解决方案1】:

    Firebase 实时数据库中的事务在单个节点上运行。如果您需要更新事务中的多个节点,则需要在要更新的节点上方的第一个公共节点上运行事务。在您的场景中,这意味着您跨 users 运行事务,这可能会显着降低吞吐量。

    另一种方法是使用多位置更新。但由于多位置更新不会自动防止并发写入,因此您必须在写入本身中包含信息以防止发生这种情况。

    有关此示例,请在此处查看我的答案:Is the way the Firebase database quickstart handles counts secure?How to update multiple children under child node using a transaction?

    【讨论】:

    • 感谢您的回复!我看不清楚,是否有任何示例可以指导我,或者您能否提供一些代码 sn-p 来看看如何做到这一点?
    • 添加了一个示例链接,尽管没有明确的复制/粘贴示例。老实说,除非您已经对 Firebase 非常有经验,否则我建议您坚持第一段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    相关资源
    最近更新 更多