【问题标题】:Testing and decrementing in an atomic operation?在原子操作中测试和递减?
【发布时间】:2013-01-23 00:26:40
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: javascript node.js mongodb


    【解决方案1】:

    仅在amount 大于 0 时才更新文档:

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

    【讨论】:

    • 哎呀...这有点太明显了...只要允许我就会接受。
    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多