Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.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 Firebase并发读/写_Javascript_Firebase_Concurrency_Google Cloud Firestore_Transactions - Fatal编程技术网

Javascript Firebase并发读/写

Javascript Firebase并发读/写,javascript,firebase,concurrency,google-cloud-firestore,transactions,Javascript,Firebase,Concurrency,Google Cloud Firestore,Transactions,我使用Firebase事务获取比较值,然后更新集合中文档的值 但是,当我使用相同的数据并同时发送查询时,它们都读取相同的值,所以我确实通过了这两个检查,结果很糟糕。 该字段递减两次 我的交易是: 让docRef=db.collection('X').doc('SF'); 让reduceValue=20; let transaction=db.runTransaction(t=>{ 返回t.get(docRef) 。然后(doc=>{ 设值=doc.data().y; 如果(值>=reduceV

我使用Firebase事务获取比较值,然后更新集合中文档的值

但是,当我使用相同的数据并同时发送查询时,它们都读取相同的值,所以我确实通过了这两个检查,结果很糟糕。 该字段递减两次

我的交易是:

让docRef=db.collection('X').doc('SF');
让reduceValue=20;
let transaction=db.runTransaction(t=>{
返回t.get(docRef)
。然后(doc=>{
设值=doc.data().y;
如果(值>=reduceValue){
t、 更新(cptRef,{y:FieldValue.increment(-reduceValue)});
回报承诺。解决(“Y增加”);
}否则{
返回承诺。拒绝(“对不起y是”);
}
});
})。然后(结果=>{
console.log('Transaction success',result);
}).catch(错误=>{
console.log('事务失败:',错误);

});如果我正确理解您的问题,您所描述的是使用Firestore客户端SDK之一执行的正确行为:

  • 您正在调用两次旨在递减计数器的函数
  • 最后,计数器递减两次
两个调用“同时”执行的事实不应该改变结果:计数器应该递减两次

这正是事务所确保的:在并发编辑的情况下,Cloud Firestore再次运行整个事务,确保初始文档(
db.collection('X').doc('SF'))在事务期间没有更改。如果是这种情况,它将使用新数据重试该操作

这是因为客户端SDK对事务使用乐观并发,因此不会锁定文档

我建议你看下面的详细解释



您还将在本视频中看到,对于从后端执行的事务(例如,使用Admin SDK),机制不同:它们实现悲观并发(事务期间锁定文档)。

您能否提供有关如何“同时发送查询”的详细信息?请使用两个设备编辑您的问题,并同时按下调用此功能的按钮