Javascript 在云函数中处理Firestore事务的并发性
我正在开发一个以firebase为后端的应用程序,我有一个google云功能,在名为“Requests”的集合中创建文档后会触发该功能。此功能背后的逻辑是,将新文档与同一集合中的现有文档进行比较,如果新文档基于某些参数与另一个文档匹配,则执行事务。 在这个事务中,我删除了两个文档,并在另一个集合中创建了一个文档。 问题在于,如果几乎同时创建多个文档,则事务会以不希望的方式运行,将同一文档作为多个文档。 据我所知,如果事务中至少有一个操作失败,事务将回滚。 但在这种情况下,这是没有意义的,因为假设在一个事务中删除文档时,在另一个事务中尝试删除文档时应该失败。 我想要的是,一个请求只接受一次,然后就被取消,而不是为一对以上的夫妇接受 这是我的交易:Javascript 在云函数中处理Firestore事务的并发性,javascript,node.js,firebase,google-cloud-firestore,google-cloud-functions,Javascript,Node.js,Firebase,Google Cloud Firestore,Google Cloud Functions,我正在开发一个以firebase为后端的应用程序,我有一个google云功能,在名为“Requests”的集合中创建文档后会触发该功能。此功能背后的逻辑是,将新文档与同一集合中的现有文档进行比较,如果新文档基于某些参数与另一个文档匹配,则执行事务。 在这个事务中,我删除了两个文档,并在另一个集合中创建了一个文档。 问题在于,如果几乎同时创建多个文档,则事务会以不希望的方式运行,将同一文档作为多个文档。 据我所知,如果事务中至少有一个操作失败,事务将回滚。 但在这种情况下,这是没有意义的,因为假设
db.runTransaction(transaction => {
return transaction.get(requestsRef.doc(docId)).then(doc => {
var data = doc.data();
var arrayUsers = [uid, data.uid];
transaction.set(db.collection('chatRoom').doc(uid.substring(0, 8) + data.uid.substring(0, 7) + doc.id.substring(0, 7))
, {
arrayUsers: arrayUsers,
uid1: uid,
uid2: uid2,
})
transaction.delete(db.collection('Requests').doc(doc.id));
transaction.delete(db.collection('Requests').doc(snap.id));
return null;
});
}).then(result => {
console.log("OK");
return null;
}).catch(err => {
console.log("ERR");
console.error(err);
});
我所期望的是:
5) 请求#1和#3被删除,我与用户#1和用户#3创建了一个聊天室我不清楚观察到的行为是什么,以及这与您想要的有什么不同。如果您编辑问题以逐步显示您的观察结果,可能会有所帮助。对不起,我想要的是一个请求只接受一次,然后被删除,而不是接受一对以上的请求,因为根据交易,同一文档被删除两次而不会产生错误,这是我不明白的,我还不清楚。正如我所建议的,编辑这个问题,以浏览不符合您预期的特定事件序列。谢谢@DougStevenson,我已经编辑了这个问题,您所说的请求#3被保留是什么意思?我不清楚观察到的行为是什么,以及这与您想要的行为有何不同。如果您编辑问题以逐步显示您的观察结果,可能会有所帮助。对不起,我想要的是一个请求只接受一次,然后被删除,而不是接受一对以上的请求,因为根据交易,同一文档被删除两次而不会产生错误,这是我不明白的,我还不清楚。正如我所建议的,编辑这个问题,以浏览不符合您预期的特定事件序列。谢谢@DougStevenson,我已经编辑了这个问题您所说的请求#3被保留是什么意思?