8

MongoDB はアトミック更新をサポートしています。つまり、ドキュメントが更新されたときに、他の更新によって以前の変更が上書きされることはないと確信できます。私の質問は、クエリと更新ステートメントの組み合わせに関連しており、以下に示す例で最もよく説明されています。

db.foo.update(
{ state : 1, players: { $size: 2 } } , 
{ $push: { players : { new player document } } }, 
false , true );

上記の例では、プレーヤーの数が 2 に等しい場合にのみ、新しいプレーヤーをプレーヤーのコレクションにプッシュしたいと考えています。上記のクエリと更新ステートメントを考えると、2 つの同時更新の両方がプレーヤーを同じドキュメントにプッシュする可能性はありますか? 、ドキュメントを読む時点で、プレーヤーの $size は 2? つまり、原子性は更新ステートメントのクエリと更新部分にまたがっていますか?

イベントのより詳細なシーケンスを編集します。

同じ更新プログラムを同時に 2 回 (U1 と U2) 起動することを検討してください。次の一連のイベントは可能ですか?

  1. U1 は、ドキュメント #1 が update ステートメントのクエリ部分と一致することを検出します。
  2. U2 は、ドキュメント #1 が update ステートメントのクエリ部分と一致することを検出します。
  3. U1 はドキュメント #1 で新しいプレーヤーをプッシュします。
  4. U2 はドキュメント #1 で新しいプレーヤーをプッシュします。

ドキュメント #1 にはプレーヤーが 2 人しか含まれていないという印象を U1 と U2 の両方が持っていたため、結果として、ドキュメント #1 には予想よりも 1 人多いプレーヤーが含まれています。

4

3 に答える 3

4

mongodb-user グループでこの質問をしました。http://groups.google.com/group/mongodb-user/browse_thread/thread/e61e220dc0f6f64c

Marc (10gen で働く) の回答によると、私が説明した状況は発生しません。

あなたが説明した状況はあり得ません。両方の更新によって同じドキュメントが変更される危険はありません。

于 2012-04-11T09:54:46.687 に答える
0

書き留めた一連のイベントでは、実際に1人のプレーヤーが多すぎる可能性があります。更新の「検索」と「更新」は、繰り返し処理する各ドキュメントに対して「検索」と「更新」を使用して自分で行うのと非常によく似ています。「$atomic」演算子を確認することをお勧めします:http ://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-ApplyingtoMultipleObjectsAtOnce

于 2012-04-06T10:46:45.700 に答える