node.js - 如何解决 Node.js 中的并发问题?

标签 node.js multithreading web-applications

我有一个文章模型和一个评论模型。每篇文章最多可以有 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 */ })    
    }    
  });
})

Sequelize Doc

关于node.js - 如何解决 Node.js 中的并发问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44915696/

相关文章:

node.js - NodeJS Express - 全局唯一请求 ID

javascript - 我们如何读取 "contents"标签的 `&lt;script&gt;`?

asp.net - 如何使用 css 设置 asp.net 网站中所有文本框的格式,而不设置每个文本框的 cssclass 属性

javascript - 查找具有较高项但低于限制的对象的 id

javascript - SerialPort 没有方法 'list'

multithreading - 并行和并发编程(Haskell)方面的开销是多少?

java - 我怎么知道线程作业已经完成?

java - Java中用于对Web应用程序进行编程的不同技术如何协同工作?

javascript - 需要模型的 Mongoose 错误

ruby-on-rails - Rspec 应该等待线程完成