查找(如果不存在)插入漏洞



执行>10个请求,至少同时,此代码插入4条相同的记录,但必须只插入1条。

用户只能启动一个活动游戏。(在活动游戏场finished = false(

console.log('performing request');
const activeGame = await db.Game.findOne({ uid, finished: false });
if (activeGame !== null) {
console.log('errored');
return { error: 'Finish previous game.' };
} else {
console.log('inserted');
const game = new db.Game({
uid,
moves: new Array(5*5).fill(0)
});
game.save();
return game;
}

日志同时10个请求:

performing request
inserted
performing request
performing request
inserted
performing request
inserted
inserted
performing request
errored
performing request
errored
performing request
errored
performing request
errored
performing request
performing request
errored
errored

交易对我没有帮助。

当然,此代码容易出现竞争条件。为了避免这种情况,您可以使用All you need is a partial unique index。将其应用于文档的uid字段,其中finished: falseet voila,您现在不能为同一用户插入两个活动游戏。

您的uid不同,因此它将插入这些时间。如果你将传递相同的uid,那么它将根据你的情况工作。

你可以试试这些。和读取save((功能。

console.log('performing request');
const activeGame = await db.Game.findOne({ _id: uid, finished: false });
if (activeGame == null) {
console.log('inserted');
const game = new db.Game({
moves: new Array(5*5).fill(0)
});
game.save();
return game;
} else {
console.log('errored');
return { error: 'Finish previous game.' };
}

console.log('performing request');
const activeGame = await db.Game.findOne({ _id: uid, finished: false });
activeGame.save()

最新更新