我有一个文章模型和一个评论模型。每篇文章最多可以有10条评论。
每当我添加评论时,都会在控制器中完成此检查。
Article.findOne({ id: 3 }, function(err, record){
if(record.commentCount < 10){
Comment.create({ /* parameters */ })
}
});
(代码未经过检查,但重要的是这里有两个查询。)
现在,由于Node.js在多台计算机上的多个线程中运行,这肯定会导致竞争条件。如果同时完成了100个请求,那么有时它们中的一些会同时获得计数,然后添加注释,因为所有这些请求都认为少于10个注释。
我该如何解决这个问题?有没有办法锁定数据库,或锁定一行? Ruby on Rails允许我进行悲观锁定并完美地解决这个问题。
答案 0 :(得分:2)
如果您使用Sequelize
作为ORM;也许你可以使用Transcation
;
如:
sequelize.transcation({
isolationLevel: Sequelize.Transaction.ISOLATION_LEVELS.SERIALIZABLE
}, function(t){
return Article.findOne({ id: 3, lock: t.LOCK.UPDATE }, function(err, record){
if(record.commentCount < 10){
Comment.create({ /* parameters */ })
}
});
})