Kotlin Firebase读写并发性

Kotlin Firebase读写并发性,kotlin,firebase-realtime-database,Kotlin,Firebase Realtime Database,当两个人同时试图将对方添加到朋友中时,我遇到了问题。因此,首先,当一个人按下“添加到朋友”按钮时,他会检查其他用户的组是否没有我的ID。如果他有,我不需要创建新组-我只需将此组的ID添加到我的列表中,否则-我将创建新组。现在,当两个人同时按下该按钮时,他们都会得到一个结果,即组不存在,因此他们都创建了一个新组。如何解决这些问题 结构: "userGroups" : { "myId1" : { "generatedGr

当两个人同时试图将对方添加到朋友中时,我遇到了问题。因此,首先,当一个人按下“添加到朋友”按钮时,他会检查其他用户的组是否没有我的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
            }
        })
}

在没有看到您的代码的情况下,很难给出具体的选项,但最有可能的选项是(按照我个人偏好的顺序):

  • 将组ID基于其中的两个用户。如果你做得正确,两个用户最终将拥有相同的组ID,谁是第一个并不重要。然后,创建组成为所谓的幂等运算,这意味着如果多次运行同一个运算,将得到相同的结果。有关此类组ID的示例,请参阅
  • 确保只有一次写入才能通过。这意味着第二个用户最终将读取第一个用户创建的组,然后可以取消其数据创建
  • ,它可以执行更多(非原子)读取操作,以检查用户组是否已存在,并拒绝第二个用户的请求

  • 我在使用事务时更新了我的代码(在帖子中)。现在两个用户都创建了新的组,但对于一个用户,事务再次运行,然后充当已经存在的组。我是否需要将这些更新返回到某个地方,或者如何防止这种情况发生?我不确定我是否理解你在那里说的话。最好打开一个新问题,清楚地再现您在交易中遇到的问题。