javascript - 在原子操作中测试和递减?

标签 javascript node.js mongodb

我刚刚找到了一个恼人的错误,它基本上是一个竞争条件。为了论证,我们假设一个非常简单的文档结构,例如 { _id : 'XXX', amount : 100 }

这些文档中有数百个存在于一个集合中,并被多个作者访问,这些作者有效地尝试将数量降低任何值但从不低于 0。目前这是通过两个查询完成的:

  • 第一个查询确定当前金额。
  • 仅当金额大于要减去的值并减少当前金额时才会触发第二个查询。

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

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

最佳答案

限定更新以仅在 amount 大于 0 时更新文档:

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

关于javascript - 在原子操作中测试和递减?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14463189/

相关文章:

javascript - $FireFox 中的插值错误

javascript - 当我尝试发出更新请求时,无法在将 header 发送到客户端后设置 header

ruby-on-rails - 未定义的方法 'dragonfly_accessor'

javascript - Node.js - 使用回调插入 MongoDB

javascript - 如何检查我的元素 ID 是否具有焦点?

javascript - : "Requesting JavaScript AST from selection" 期间发生内部错误

javascript - node.js 上的客户端 ssl 授权

node.js - 测试除状态代码之外的响应 header 字段的困难

node.js - 在 node.js 中,如何将变量传递给 :stylus filter from jade?

mongodb排序时先返回大写字符串