如何在Node.js中解决这个并发问题?

时间:2017-07-05 01:07:32

标签: node.js multithreading web-applications

我有一个文章模型和一个评论模型。每篇文章最多可以有10条评论。

每当我添加评论时,都会在控制器中完成此检查。

Article.findOne({ id: 3 }, function(err, record){

    if(record.commentCount < 10){

        Comment.create({ /* parameters */ })    

    }    

});

(代码未经过检查,但重要的是这里有两个查询。)

现在,由于Node.js在多台计算机上的多个线程中运行,这肯定会导致竞争条件。如果同时完成了100个请求,那么有时它们中的一些会同时获得计数,然后添加注释,因为所有这些请求都认为少于10个注释。

我该如何解决这个问题?有没有办法锁定数据库,或锁定一行? Ruby on Rails允许我进行悲观锁定并完美地解决这个问题。

1 个答案:

答案 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 */ })    
    }    
  });
})

Sequelize Doc