2017-07-05 48 views
0

私は記事モデルとコメントモデルを持っています。各記事に最大10のコメントを付けることができます。Node.jsでこの並行性の問題を解決するにはどうすればよいですか?

コメントを追加するたびに、このチェックはコントローラで実行されます。

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

    if(record.commentCount < 10){ 

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

    }  

}); 

(コードはチェックされていませんが、ここでは2つのクエリが重要です)。

ここで、Node.jsは複数のコンピュータ上の複数のスレッドで実行されるため、これは間違いなく競合状態になります。同時に100件のリクエストが行われた場合、10人以下のコメントがあると思っている人もいると思うので、そのうちいくつかが同時にカウントを取得してからコメントを追加することは避けられません。

どうすればこの問題を解決できますか?データベースをロックするか、行をロックする方法はありますか? Ruby on Railsでは、私は悲観的なロックを行い、この問題を完全に解決できます。

+0

次のいずれかが、多くの場合、そのようなことのために使用さ10未満(SQLがある場合にのみ、新しいコメントが追加されます(データベースサーバ上の)アトミック操作を必要とします)、またはあるプロセスが一時的なロックを取得する能力が必要です。これらは両方ともあるデータベース機能であり、他のデータベース機能ではないデータベース機能であるため、特定のデータベースについて質問する必要があります。現在のあなたの質問は、あなたが使用しているデータベースについて何も言いませんし、適切な機能を得るためにどのデータベースを使用すべきか尋ねません。 – jfriend00

答えて

2

ORMにSequelizeを使用すると、おそらく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

関連する問題