如何避免种族状况?

时间:2019-02-23 17:53:29

标签: firebase dart flutter google-cloud-firestore race-condition

我与Flutter和Firestore做一个随机的1:1聊天应用程序。 但是当我连接第二个用户聊天时,我有比赛条件。

这是我的客户端应用代码,用于将第二个用户添加到Firestore(第一个用户已添加到Firestore文档中):

await chatRoomReference.setData({
  ‘secondUserUID': uid,
});

第二位用户点击聊天时,我是删除选项,可从所有客户端UI进入此聊天室。 但是如果第三位用户同时点击聊天(在UI从流中获取更新之前),则可能会将他也添加到数据库中。聊天不允许这样做。

如何避免比赛状况?

谢谢!

更新:

每个聊天用户都作为新文档添加到单独的用户聊天集中。

1 个答案:

答案 0 :(得分:0)

我认为您的按钮应该先检查聊天室中的人数,然后再加入聊天室。

checkBeforeJoinTheChatRoom()
    .then((numbOfPeople){
        if(numbOfPeople < 2){ 
            joinChat();
        }
    }
)

编辑:在您的情况下,交易可能有效:

final DocumentReference postRef = Firestore.instance.document('posts/123');
Firestore.instance.runTransaction((Transaction tx) async {
  DocumentSnapshot postSnapshot = await tx.get(postRef);
  if (postSnapshot.exists) {
    await tx.update(postRef, <String, dynamic>{'likesCount': postSnapshot.data['likesCount'] + 1});
  }
});

详细了解:cloud_firestore_transactions