gpt4 book ai didi

javascript - 在写入数据库的并发 API 调用发生时(或服务器速度慢时)防止竞争条件

转载 作者:搜寻专家 更新时间:2023-11-01 00:44:02 25 4
gpt4 key购买 nike

让我们想象一个场景,您将使用一个端点来创建用户。这将在一个 Restful 应用程序中,所以让我们想象一个富客户端调用这个 API 端点。

exports.createUser = function(req,res){
if(req.body){
//Check if email has already been used
db.User.find({where:{email:req.body.email}}).success(function(user){
if(user === null || user === undefined){
//Create user
res.send(201);
} else {
res.json(409,{error: 'User already exists'});
}
});
} else {
res.send(400);
}
};

如果我要非常快地多次调用此端点,则可能会在数据库中使用同一封电子邮件创建多条记录,即使您查询了用户表以确保没有重复。

我确定这是一个常见问题,但如何才能避免出现此问题呢?我很难限制对特定端点的请求数量,但这似乎不是一个很好的解决方案。

有什么想法吗?非常感谢!

最佳答案

最简单的选择是在执行查找然后插入的事务开始时 LOCK TABLE "users"IN EXCLUSIVE MODE。这确保一次只能有一个事务写入表。

为了更好的并发性,你可以:

如果使用唯一约束,需要考虑的一件事是您的应用可能会将用户标记为禁用但不删除他们,并且可能不希望强制电子邮件地址对于禁用用户是唯一的。如果是这样,您可能需要部分唯一索引(请参阅文档)。

关于javascript - 在写入数据库的并发 API 调用发生时(或服务器速度慢时)防止竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25296929/

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