mongodb同步请求

时间:2014-09-16 10:21:17

标签: javascript node.js mongodb

我对node.js和mongodb完全不熟悉,我对同一时间段内发生的多个请求的同步有疑问。我已经阅读了一些关于这个主题的帖子,但我还没有找到令人满意的答案......

我有以下情况:

我的馆藏中的文件有一个州财产。根据请求,我根据状态选择一个文档,然后更新状态。

现在的问题是,如果同时存在多个请求,则所有请求都会选择相同的Document,因为第一个更新尚未写入数据库,但每个请求都应该获得一个“自己的文档”。

使用node.js和mongodb来满足这个要求是不是一个好主意,还是应该坚持使用RDBMS的“经典”方法?

我主要关注可伸缩性,这就是我首先选择node.js和mongodb的原因。

我非常感谢你能给我的每一条建议, 最诚挚的问候

1 个答案:

答案 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" } } )

使用findAndModifyoccupied标志可以确保每个线程获得一个文档,并且在原始线程使用它的过程中,该文档不会被另一个线程触及。