MongoDB:查找(如果不存在,请插入,易受攻击性

问题描述 投票:0回答:2

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

用户只能启动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

P.S。交易对我没有帮助

javascript node.js mongodb mongoose fastify
2个回答
0
投票

当然,此代码容易出现竞争情况。为避免这种情况,请使用findOneAndUpdate。它自动执行这两个操作。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.