我的问题是我正在尝试开发NodeJs REST服务,人们可以在我的网站上注册自己。我的注册流程是这样的:
1.检查是否有任何用户使用相同的电子邮件退出
如果用户存在,请发送回复以告知该用户已存在
如果用户不存在,请使用输入的详细信息创建一个用户对象。
4.现在将其插入数据库。
现在让我们说我有两个用户" A"和" B" ,他们输入了相同的电子邮件ID,现在让我们说用户A和B都达到我的代码将检查用户是否退出的点,他们都会得到该用户不存在,他们的流程将转向创建对象并在DB上创建对象。 现在在这种情况下,如果我们在Java中有一个synchronized块,我们可以防止这两种情况同时创建对象,但在NodeJS中我该如何实现呢?以及如何避免这种竞赛的局面?
NodeJ是单线程还是具有公共堆栈会阻止这种情况发生吗?或者如果在NodeJ中有任何其他方法可以做到这一点? 我是NodeJs的新手,如果我提到错误,我很抱歉。
答案 0 :(得分:2)
严格来说,node.js在一个线程上运行,但是你的程序 工作流,包括I / O(数据库,文件系统),客户端和 一切都在很多线程上运行。
来源:Can node.js code result in race conditions?
您可以使用事务在数据库级别中防止出现这种情况。或者您也可以在应用层中进行预防。
您可以使用(并且应该使用)事务(假设SQL)来确保数据的一致性和完整性。
此外,使用输入电子邮件的hashmap跟踪内存中的寄存器状态:
var PENDING_EMAILS = {}
app.post("/register", function(req, res) {
var email = req.body.email
if(PENDING_EMAILS[email]) {
return res.send("Email is busy")
}
PENDING_EMAILS[email] = true // check this email as busy
// register operation
// check in DB etc...
delete PENDING_EMAILS[email] // also, release hashmap key when register finishes or when there is an error
})
这种方法可以防止您的问题。