如何避免竞争条件?

问题描述 投票:1回答:1

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

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

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

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

如何避免竞争条件?

谢谢!

更新:

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

firebase dart flutter google-cloud-firestore race-condition
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.