gpt4 book ai didi

mysql - 我想测试一个事件是否还有地方,如果是的话用户可以参加,我使用node js api rest

转载 作者:行者123 更新时间:2023-11-29 06:26:18 25 4
gpt4 key购买 nike

我想测试一个事件是否还有名额,如果有,用户可以参加,nbr_place zattribute 将减 1,如果没有,将显示错误消息“没有更多名额”,我正在使用 Node js api Rest ,这是我的代码

更新sql请求工作正常,但问题出在测试上

/* UPDATE EVENT nbr place */
app.put('/participate/:id', (req, res) => {


const id = req.params.id;
//const nbr_place = req.params.nbr_place;
con.query('SELECT nbr_place FROM evenement where id_evenement=?',[id],function (err,result,fields) {
if (result && result.length)
res.json('no more places');
else {
con.query('UPDATE evenement SET nbr_place = nbr_place - 1 WHERE id_evenement = ?', [id], (error, result) => {
if (error) throw error;

res.send('decremented successfully');
});
}
});
});

最佳答案

您的代码的问题在于您没有检查 SELECT 查询返回的值(您只是检查查询是否返回了某些内容)。

但就概念而言,运行select然后运行update会创建一个竞争条件,其中,通常两个并发进程可能选择 事件的最后一个剩余座位,导致剩余 -1 座位。

更好的解决方案是运行一次更新,并以剩余席位数为条件,然后检查它是否成功(即记录是否受到影响)。通过这种技术,您的数据库可以为您处理并发性(这是数据库真正擅长的事情)。

考虑:

app.put('/participate/:id', (req, res) => {
const id = req.params.id;
con.query(
'UPDATE evenement SET nbr_place = nbr_place - 1 WHERE id_evenement = ? and nbr_place > 0',
[id],
function (err,result,fields) {
if (err) throw err;
if (result.affectedRows > 0) {
res.send('decremented successfully');
} else {
res.json('no more places');
}
}
);
});

关于mysql - 我想测试一个事件是否还有地方,如果是的话用户可以参加,我使用node js api rest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59346439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com