在原子操作中测试和减少?

时间:2013-01-22 16:22:10

标签: javascript node.js mongodb

我刚刚找到了一个令人讨厌的bug,这基本上就是竞争条件。为了论证,我们假设一个非常简单的文档结构,如{ _id : 'XXX', amount : 100 }

这些文档中有数百个这样的文档存在于一个集合中,并且由多个编写者访问,这些编写者有效地尝试将任何值减少但从不低于0.目前这是通过两个查询来完成的:

  • 第一个查询确定当前金额。
  • 只有当金额大于减去当前金额和减少当前金额的金额时,才会触发第二个查询。

当多个线程同时执行此操作时,这当然容易导致混乱。但有没有办法在原子操作中做到这一点?我在文档中找不到类似test-and-set操作的内容。

如果相关:运行这些操作的代码是运行多个Node.js实例和mongodb npm包的服务器端JavaScript。

1 个答案:

答案 0 :(得分:8)

如果amount大于0,则将更新限定为仅更新文档:

db.coll.update({_id: 'XXX', amount: {$gt: 0}}, {$inc: {amount: -1}})