Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在云函数中处理Firestore事务的并发性_Javascript_Node.js_Firebase_Google Cloud Firestore_Google Cloud Functions - Fatal编程技术网

Javascript 在云函数中处理Firestore事务的并发性

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”的集合中创建文档后会触发该功能。此功能背后的逻辑是,将新文档与同一集合中的现有文档进行比较,如果新文档基于某些参数与另一个文档匹配,则执行事务。 在这个事务中,我删除了两个文档,并在另一个集合中创建了一个文档。 问题在于,如果几乎同时创建多个文档,则事务会以不希望的方式运行,将同一文档作为多个文档。 据我所知,如果事务中至少有一个操作失败,事务将回滚。 但在这种情况下,这是没有意义的,因为假设

我正在开发一个以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);
        });
我所期望的是:

  • 用户#1创建请求#1
  • 用户#2创建请求#2
  • 用户#3创建请求#3
  • 请求#1和#2被删除,我与用户#1和用户#2创建了一个聊天室
  • 请求#3被搁置
  • 发生了什么:

  • 用户#1创建请求#1
  • 用户#2创建请求#2
  • 用户#3创建请求#3
  • 请求#1和#2被删除,我与用户#1和用户#2创建了一个聊天室

  • 5) 请求#1和#3被删除,我与用户#1和用户#3创建了一个聊天室

    我不清楚观察到的行为是什么,以及这与您想要的有什么不同。如果您编辑问题以逐步显示您的观察结果,可能会有所帮助。对不起,我想要的是一个请求只接受一次,然后被删除,而不是接受一对以上的请求,因为根据交易,同一文档被删除两次而不会产生错误,这是我不明白的,我还不清楚。正如我所建议的,编辑这个问题,以浏览不符合您预期的特定事件序列。谢谢@DougStevenson,我已经编辑了这个问题,您所说的请求#3被保留是什么意思?我不清楚观察到的行为是什么,以及这与您想要的行为有何不同。如果您编辑问题以逐步显示您的观察结果,可能会有所帮助。对不起,我想要的是一个请求只接受一次,然后被删除,而不是接受一对以上的请求,因为根据交易,同一文档被删除两次而不会产生错误,这是我不明白的,我还不清楚。正如我所建议的,编辑这个问题,以浏览不符合您预期的特定事件序列。谢谢@DougStevenson,我已经编辑了这个问题您所说的请求#3被保留是什么意思?