Firebase:在单个事务中更新多个对象

时间:2015-07-20 21:56:46

标签: java firebase

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

然而,如果有任何推荐的数据结构设计,仍然很难找到。 我看到一个多写库firebase-multi-write,表示在大多数情况下你可能不需要这样做。

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

/users/A : {credit:20}

/users/B : {credit:3}

/users/C :  {credit:10}

每个用户可以同时从所有人中窃取信用。

  • B点数的抢断看起来像{21,2}
  • 来自C点数的B抢断看起来像{3,9}
  • 来自A点数的C抢断看起来像{11,20}

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

Java 中维护数据完整性的同时处理此类场景的最佳方法是什么?

1 个答案:

答案 0 :(得分:5)

2015年9月,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());
       }
   }
});