firebase - 以原子方式更新多个节点并将值加 1

标签 firebase firebase-realtime-database

我必须更新我的代码,并通过将节点的值增加 1 来实现对节点的另一个子更新。我当前的代码如下所示(工作正常):

String key = database.child("rides").push().getKey();

Map<String, Object> childUpdates = new HashMap<>();
childUpdates.put("/rides/" + key, ride.toMap());
childUpdates.put("/ridesUser/" + ride.getUserID() + "/ownRides/" + key, ride.getTime());

database.updateChildren(childUpdates, new DatabaseReference.CompletionListener() {
    @Override
    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
    }
});

添加增量代码的简单方法是:

childUpdates.put("/stations/" + ride.getFromID() + "/rideCount", fromStation.getRideCount() + 1);

但是,如果其他用户添加了此车站的行程,fromStation.getRideCount() 可能已经过时。 我读过几篇关于使用事务增加值的文章。如何将子更新和事务结合起来?我应该在 "/stations/"+ride.getFromID() 上运行事务,并在 doTransaction() 方法中更新我的 child 吗?这是原子性的吗?

最佳答案

如果您读过几篇文章,您可能已经看到了这一点:不可能将多位置更新和事务结合起来。

您的选择:

  1. 在树中的最低公共(public)级别执行事务

  2. 使用安全规则来实现多位置更新的伪交易。请参阅this answer from Katothis more recent answer from me

  3. 从客户端写入“更改记录”,然后让服务器(不太可能面临争用)以事务方式执行更新。例如,请参阅我对此问题的回答:When should you use Firebase Transactions

关于firebase - 以原子方式更新多个节点并将值加 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39428856/

相关文章:

android - 如何从 Firebase 检索数据和特定用户数据

javascript - JS构造函数看不到变量

Firebase,通过同一电子邮件不同的提供商登录

ios - FirebaseUI-iOS FUIIndexArray 用法

Android Firebase,只需获取一个子对象的数据

android - flutter : how i get data from firestore in List<String>?

firebase - 无法通过 Visa 卡将 Firebase 升级为即付即用计划

android - 从 Google Drive 迁移到 Cloud Firestore

java - 如何在没有事件监听器的情况下检查数据是否仅存在于 firebase 数据库中一次

java - Android Firebase - 是否可以在 startAt() 和 endAt() 之间使用 limitToFirst()/limitToLast()