我与Flutter和Firestore随机1:1聊天应用程序。但是当我连接第二个用户聊天时,我有竞争条件。
这是我的客户端应用程序代码,用于将第二个用户添加到Firestore(第一个用户已添加到Firestore文档):
await chatRoomReference.setData({
‘secondUserUID': uid,
});
当第二个用户点击聊天时,我将删除从所有客户端UI进入此聊天室的选项。但是,如果第三个用户同时点击聊天(在UI从流中获取更新之前),他也可能会添加到数据库中。聊天不应该允许这样。
如何避免竞争条件?
谢谢!
更新:
每个聊天用户都作为新文档添加到单独的用户集合中进行聊天。
我认为您的按钮应该检查聊天室中的人数然后加入聊天室。
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});
}
});