我刚刚找到了一个恼人的错误,它基本上是一个竞争条件。为了论证的缘故,让我们假设一个非常简单的文档结构,例如{ _id : 'XXX', amount : 100 }
.
数百个这样的文档存在于一个集合中,并由多个编写者访问,这些编写者有效地尝试将数量降低任何值,但从不低于 0。目前这是通过两个查询完成的:
- 第一个查询确定当前金额。
- 仅当金额大于要减去的值并减少当前金额时,才会触发第二个查询。
当多个线程同时执行此操作时,这当然容易导致混乱。但是有没有办法在原子操作中做到这一点?test-and-set
我在文档中找不到类似操作的东西。
如果相关:运行这些操作的代码是运行多个 Node.js 实例和mongodb
npm 包的服务器端 JavaScript。