MongoDB はアトミック更新をサポートしています。つまり、ドキュメントが更新されたときに、他の更新によって以前の変更が上書きされることはないと確信できます。私の質問は、クエリと更新ステートメントの組み合わせに関連しており、以下に示す例で最もよく説明されています。
db.foo.update(
{ state : 1, players: { $size: 2 } } ,
{ $push: { players : { new player document } } },
false , true );
上記の例では、プレーヤーの数が 2 に等しい場合にのみ、新しいプレーヤーをプレーヤーのコレクションにプッシュしたいと考えています。上記のクエリと更新ステートメントを考えると、2 つの同時更新の両方がプレーヤーを同じドキュメントにプッシュする可能性はありますか? 、ドキュメントを読む時点で、プレーヤーの $size は 2? つまり、原子性は更新ステートメントのクエリと更新部分にまたがっていますか?
イベントのより詳細なシーケンスを編集します。
同じ更新プログラムを同時に 2 回 (U1 と U2) 起動することを検討してください。次の一連のイベントは可能ですか?
- U1 は、ドキュメント #1 が update ステートメントのクエリ部分と一致することを検出します。
- U2 は、ドキュメント #1 が update ステートメントのクエリ部分と一致することを検出します。
- U1 はドキュメント #1 で新しいプレーヤーをプッシュします。
- U2 はドキュメント #1 で新しいプレーヤーをプッシュします。
ドキュメント #1 にはプレーヤーが 2 人しか含まれていないという印象を U1 と U2 の両方が持っていたため、結果として、ドキュメント #1 には予想よりも 1 人多いプレーヤーが含まれています。