我有一个文章模型和一个评论模型。每篇文章最多可以有 10 条评论。
每当我添加评论时,都会在 Controller 中完成此检查。
Article.findOne({ id: 3 }, function(err, record){
if(record.commentCount < 10){
Comment.create({ /* parameters */ })
}
});
(代码没有被检查,但重要的是这里有两个查询)。
现在,由于 Node.js 在多台计算机上的多个线程中运行,这肯定会导致竞争条件。如果同时有100个请求,难免有些人会同时先获取计数,然后添加评论,因为他们都认为评论数少于10条。
我该如何解决这个问题?有没有办法锁定数据库或锁定一行? Ruby on Rails 允许我进行悲观锁定并完美解决这个问题。
最佳答案
如果你使用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 */ })
}
});
})
关于node.js - 如何解决 Node.js 中的并发问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44915696/