我对node.js和mongodb完全不熟悉,我对同一时间段内发生的多个请求的同步有疑问。我已经阅读了一些关于这个主题的帖子,但我还没有找到令人满意的答案......
我有以下情况:
我的馆藏中的文件有一个州财产。根据请求,我根据状态选择一个文档,然后更新状态。
现在的问题是,如果同时存在多个请求,则所有请求都会选择相同的Document,因为第一个更新尚未写入数据库,但每个请求都应该获得一个“自己的文档”。
使用node.js和mongodb来满足这个要求是不是一个好主意,还是应该坚持使用RDBMS的“经典”方法?
我主要关注可伸缩性,这就是我首先选择node.js和mongodb的原因。
我非常感谢你能给我的每一条建议, 最诚挚的问候
答案 0 :(得分:1)
您可以在客户端(单例控制器等)中完全建模此并发访问模式,或使用一些MongoDB功能。要在数据库中对其进行建模,请考虑以下文档结构(在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
是原子的。它将检索文档并设置occupied : true
,而其他线程没有任何可能尝试使用同一个浴室或在thread65开始查看它时修改它(假设其他线程检查occupied
)。现在线程65可以使用浴室,一旦完成它,腾出它并可能改变其他属性:
> db.restrooms.update({ "_id" : thread65_wc._id },
{ "$set" : { "occupied" : false, "dirty" : "very" } } )
使用findAndModify
和occupied
标志可以确保每个线程获得一个文档,并且在原始线程使用它的过程中,该文档不会被另一个线程触及。