Firebase读写并发



当两个人同时试图将对方添加为好友时,我遇到了问题。因此,一开始,当一个人按下add to friends时,他会检查其他用户的组是否没有我的ID。如果他有,我就不需要创建新的组——我只会将这个组的ID添加到我的列表中,否则——我会创建新组。现在,当两个人同时按下这个按钮时,他们都会得到一个结果,即群组不存在,因此他们都创建了一个新的群组。如何解决这些问题?

结构:

"userGroups" : {
"myId1" : {
"generatedGroupId1" : "myFriendID1"
}
}

更新:我已经做到了:基本上,在doTransaction中,如果不存在,我会创建组,然后在onComplete中,我使用已经创建的组。如果两个人开始创建新的小组,一个人最终创建,另一个人阅读

// function
ref.runTransaction(object : Transaction.Handler {
override fun doTransaction(currentData: MutableData): Transaction.Result {
// create group here if data is null
return Transaction.success(currentData)
}
override fun onComplete(
error: DatabaseError?,
committed: Boolean,
currentData: DataSnapshot?
) {
Log.d(TAG, "postTransaction:onComplete:" + error)
// continue doing stuff, group already exists at this point
}
})
}

在没有看到您的代码的情况下很难给出具体的选项,但最有可能的选项是(根据我个人的喜好(:

  1. 将组ID建立在其中的两个用户的基础上。如果正确执行此操作,两个用户最终将使用相同的组ID,谁是第一个并不重要。然后,创建组就变成了所谓的幂等运算,这意味着如果多次运行同一个运算,就会得到相同的结果。有关此类组ID的示例,请参阅Firebase中管理聊天频道的最佳方式
  2. 使用事务来确保只有一次写入通过。这意味着第二个用户最终会读取第一个用户创建的组,然后可以取消他们的数据创建
  3. 使用云函数,它可以执行更多(非原子(读取操作来检查用户组是否已经存在,并拒绝第二个用户的请求

最新更新