【发布时间】:2012-06-13 00:19:51
【问题描述】:
在MongoDB Update documentation 中,他们谈到更新操作符是原子的。如果以下查询在同一时刻被调用五次,并且 Zugwalt 的声誉从零开始,我希望最终声誉为 5:
db.rep.update({_id: "Zugwalt"}, {$inc: {reputation: 1}});
但是如果更新查询是这样呢?
db.rep.update({_id: "Zugwalt", reputation: {$lte: 3}}, {$inc: {reputation: 1}});
声望是否总是只更新 3 次,还是有一些奇怪的竞争条件可以更新更多?
我的特殊情况是使用活跃用户“声明文档”。我执行类似于以下的查询:
db.myCollection.update({_id: "doc_id", activeUser: {$exists: false}}, {$set: {activeUser: "Zugwalt"}});
理想情况下,如果此查询在同一实例中多次触发,则只有一次更新会导致集合被修改。但是,如果搜索组件在更新时不是原子的,我可以看到一个竞争条件,它首先更新为将 activeUser 设置为一个用户,然后立即设置为另一个用户。
旁注:findAndModify 命令具有这种原子性似乎更清楚,但是我不想使用它,因为在我们使用我们的 node-js 驱动程序进行的经验测试中,在重负载下总体上看起来要慢得多.
【问题讨论】: