【问题标题】:Firebase: Update multiple objects in single transactionFirebase:在单个事务中更新多个对象
【发布时间】:2015-10-10 04:44:16
【问题描述】:

我在下面找到了一些讨论这种情况的线程。

但是仍然在努力寻找,如果有任何推荐的数据结构设计。 我看到了一个多写库firebase-multi-write,它说在大多数情况下你可能不需要这个。

但我认为我确实需要这个,我的场景是:3 个用户

/users/A : {credit:20}

/users/B : {credit:3}

/users/C :  {credit:10}

每个用户都可以同时窃取彼此的积分。,

  • A 抢断 B 学分看起来像 {21, 2}
  • C 学分中的 B 抢断看起来像 {3, 9}
  • A 学分中的 C 抢断看起来像 {11, 20}

现在我需要更新每个用户的信用以保持这种一致性,以便每个窃取操作本质上是原子的。

Java 中保持数据完整性的同时,处理这种情况的最佳方法是什么?

【问题讨论】:

  • 您的第一个链接线程讨论了另一种方法(事件溯源-martinfowler.com/eaaDev/EventSourcing.html)。您将编写一个事件来捕获所有三个窃取事件,然后当您需要查找当前信用余额时,您将加载初始状态(可能为 0 信用),然后播放事件历史记录,直到您最终到达最终状态。奖励积分 - 你有所有“偷窃”的历史。这是不可接受的原因吗?
  • 谢谢,我提到的场景是我设想的工作流的简化版本。这是简单游戏应用程序的一部分,其中 A 抢断 B,然后 B 将其抢回,C 和 D 玩家混合在一起。所以对于一个简单的原子更新来说计算太多了??
  • 我对您的场景知之甚少,无法知道原子操作是否有效 - 但您所描述的内容对我来说听起来不像原子操作。如果 A 从 B 拿走然后“在下一刻” B 把它偷回来……那不是原子的。这是两个不同的操作,碰巧发生在彼此附近。
  • 确实如此。这些听起来像是不同的操作。对于这个用例,事务就足够了。 queue 或事件溯源将最好地处理原子事务更改。简单的multiple-path writes 现在可以用于更简单的情况,目标只是一次更新所有 3 条路径。

标签: java firebase


【解决方案1】:

在 setember/2015 firebase 开发人员发布了new version

在此版本中,您现在可以对两个位置进行一次原子更新:

Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
// Generate a new push ID for the new post

Firebase newPostRef = ref.child("posts").push();
String newPostKey = newPostRef.getKey();

// Create the data we want to update
Map newPost = new HashMap();
newPost.put("title", "New Post");
newPost.put("content", "Here is my new post!");

Map updatedUserData = new HashMap();
updatedUserData.put("users/posts/" + newPostKey, true);
updatedUserData.put("posts/" + newPostKey, newPost);

// Do a deep-path update
ref.updateChildren(updatedUserData, new Firebase.CompletionListener() {
   @Override
   public void onComplete(FirebaseError firebaseError, Firebase firebase) {
       if (firebaseError != null) {
           System.out.println("Error updating data: " + firebaseError.getMessage());
       }
   }
});

【讨论】:

    猜你喜欢
    • 2019-12-30
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多