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

Mongo: eliminating race condition on conditional update

是否可以仅在满足条件的情况下插入或更新集合中的项,而不存在竞争条件?

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

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

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

你需要的是findAndModify ;)

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

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

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