Javascript Node.js中的事件循环和数据库访问
我一直在阅读一些关于Node.js的信息,有一个特别的问题。 让我试着用下面的例子来解释它:Javascript Node.js中的事件循环和数据库访问,javascript,node.js,mongodb,rest,Javascript,Node.js,Mongodb,Rest,我一直在阅读一些关于Node.js的信息,有一个特别的问题。 让我试着用下面的例子来解释它: model.book.findOne({'Id': request.params.Id}, null, function (err, book) { if (err || book== null) { //Do some error handling } //Rating calculation happens here (add new rating and calcu
model.book.findOne({'Id': request.params.Id}, null, function (err, book) {
if (err || book== null) {
//Do some error handling
}
//Rating calculation happens here (add new rating and calculate the average)
//Something like book.ratings.push(...)
book.save(function (err) {
if (err) {
console.log(err);
}
return reply(book);
});
}
用户可以对我的服务器进行rest调用,在那里他们可以对数据库中的一本书进行评级(本例中是MongoDb)。如果两个用户执行相同的rest请求的时间非常接近,会发生什么情况?是否会发生以下情况:
- User1执行rest请求
- User1从数据库中按id获取图书
- User1开始进行评级计算
- User2执行rest请求
- User2从数据库中按id获取图书
- User1完成计算并保存书本
- User2开始进行评级计算(用户1没有新的评级)
- User2完成计算并保存书本
提前谢谢 @Jdruwe Mongodb支持文档中的原子操作,因此您不必担心写操作看起来您正在使用Mongoose。如果是这样,Mongoose的
push
是原子的(请参阅),因此您不必担心并发写入。这是否意味着回调返回的book对象可以安全地编辑和保存,而不必关心其他请求?当然,如果计算在内存中完成,文档中Mongo中的所有操作都是原子的(我猜在本例中,当加载book对象,然后进行一些操作时)如果编码不正确,很有可能会出现错误场景……是的,我也这么想,所以我决定使用findOneAndUpdate。