Mongo:消除条件更新的竞争条件

时间:2015-01-21 07:25:01

标签: multithreading mongodb concurrency distributed race-condition

只有在满足条件且没有竞争条件的情况下,是否可以插入或更新集合中的项目?

例如,假设我有一个包含timestamp字段和temperature字段的集合。只有在时间戳至少有一个小时的情况下才能更新特定项目吗?我知道我可以(步骤1)通过一次调用检查时间戳,然后(步骤2)进行一些数学运算以查看时间戳是否超过一小时前,然后(步骤3)更新集合中的项目(如果是)。

但是如果另一个客户端在此客户端运行第2步时更新客户端,则会失败。然后,当我只想要一个更新时,会发生两次更新。

这不是我正在处理的具体案例,但说明了我的问题。如果mongo操作依赖于另一个mongo操作,那么如何解决竞争条件?

1 个答案:

答案 0 :(得分:5)

您需要的是findAndModify;)

它允许在单个操作中执行GET后跟UPDATE

您可以使用处理标记,首先是false,然后在执行findAnModify()

时更改它
db.col.findAndModify({
    query: { processed: false },
    update: { $inc: { score: 1 }, $set:{processed: true} }
})