mongodb同步请求
我完全是新的node.js和mongodb,我有一个关于在同一时间期间发生的多个请求的同步的问题。 我已经阅读了关于这个主题的一些线索,但是我还没有find一个满意的答案呢。
我有以下情况:
我的集合中的文档具有状态属性。 在请求我select基于状态的文档,然后更新状态。
现在的问题是,如果有多个请求在同一时间所有请求将select相同的文档,因为第一个更新还没有写入数据库,但每个请求应该得到一个“自己的文档”来处理。
在这个需求中使用node.js和mongodb是否是一个好主意,还是应该坚持RDBMS的“经典”方法?
我的主要焦点是可伸缩性,这就是为什么我首先select了node.js和mongodb的原因。
我非常感谢你能给我的每一个build议,最好的问候
您可以在客户端(单例控制器等)中完全build立此并发访问模式或使用一些MongoDBfunction。 要在数据库中对其进行build模,请考虑如下所示的文档结构(在mongo shell中完成的示例):
{ "_id" : 1, "type" : "bathroom", "occupied" : false }
当线程65需要使用浴室时,它发出一个findAndModify
查询,并将浴室标记为已被占用:
> var thread65_wc = db.restrooms.findAndModify( { "query" : { "type" : "bathroom", "occupied" : false }, "update" : { "$set" : { "occupied" : true } } })
findAndModify
是primefaces的。 它将检索文档并设置occupied : true
而不会有另一个线程尝试使用相同的浴室,或者一旦thread65开始查看它(假设检查是否occupied
其他线程occupied
),就修改它。 现在螺纹65可以使用卫生间,一旦完成,它腾空它,并可能改变其他属性:
> db.restrooms.update({ "_id" : thread65_wc._id }, { "$set" : { "occupied" : false, "dirty" : "very" } } )
使用findAndModify
和一个occupied
标志,你可以确保每个线程获得一个文档,并且在原始线程使用它的时候,这个文档不会被另一个线程所触及。