我想创建一个记录,如果在DB中不存在,那么首先我执行查询以找到该特定记录,如果不存在,则执行anoter查询以创建它。
但问题是,如果同一数据同时出现多个请求。所有请求都试图找到该记录,因为它尚未创建,它们都会通过第一个条件并在DB中创建。
代表。 我在DB中有“开始”和“结束”字段。我不希望任何记录有重叠时间,所以首先我执行查询查询如下:
db.slots.find({
from: {
$lte: req.body.end
},
to: {
$gte: req.body.from
}
})
如果没有记录,那么我执行创建查询,否则我返回响应而不创建插槽。
所以如果两个请求同时出现相同的插槽时序,那么两个请求都先传递查找,因为还没有创建记录,然后两者都被创建,所以我想要实现类似“锁定”的东西。
答案 0 :(得分:0)
您可以编写一个功能。并在函数内部执行任务。并使函数并发。通过全球承诺。
var mypromise;
function myfunction(){
if(mypromise) return mypromise;
mypromise = new Promise(
function (resolve, reject) {
···
resolve(value); // success
mypromise = false;
});
return mypromise;
}