2

基本的に競合状態である厄介なバグを追跡しました。議論のために、のような非常に単純なドキュメント構造を想定しましょう{ _id : 'XXX', amount : 100 }

これらのドキュメントの数百はコレクション内に存在し、複数のライターがアクセスします。複数のライターは、金額を任意の値だけ効果的に下げようとしますが、0を下回ることはありません。現在、これは2つのクエリで実行されます。

  • 最初のクエリは現在の金額を決定します。
  • 2番目のクエリは、金額が現在の金額を減算およびデクリメントする値よりも大きい場合にのみ実行されます。

もちろん、これは、複数のスレッドが同時にこれを行うときに混乱を引き起こす傾向があります。しかし、アトミック操作でこれを行う方法はありますか?test-and-setドキュメントで操作のようなものを見つけることができませんでした。

関連する場合:これらの操作を実行するコードは、複数のNode.jsインスタンスとmongodbnpmパッケージで実行されるサーバーサイドJavaScriptです。

4

1 に答える 1

8

amount0より大きい場合にのみドキュメントを更新するように更新を修飾します。

db.coll.update({_id: 'XXX', amount: {$gt: 0}}, {$inc: {amount: -1}})
于 2013-01-22T16:26:40.367 に答える