免責事項これは私の頭の中のすべてですので、間違っていても私を十字架につけないでください. しかし、私を修正してください。
なぜ彼らはすべきですか?
- 前提: データベースは定義上、相互接続されていない
- oplog エントリは常に冪等です
- Oplog はキャップ付きコレクションであり、挿入順序を維持することが保証されています
適用されるクエリの真の並列性を仮定しましょう。そのため、2 つのクエリが同時に到着し、どちらを最初に oplog に挿入するかを決定する必要があります。最初にロックを取得した人が最初に書き込みますよね?以外に、問題があります。最初のクエリは単純なクエリでdb.collection.update({_id:"foo"},{$set:{"bar":"baz"}})
、もう 1 つのクエリはより複雑であり、そのため正確性の評価に時間がかかるとします。したがって、それを防ぐために、到着時にロックを取得し、べき等な oplog エントリが書き込まれた後に解放する必要がありました。
ここは自分の記憶に頼るしかない
ただし、クエリは並行して適用されません。クエリはキューに入れられ、到着順に評価されます。データベースは、クエリ オプティマイザーを実行した後、クエリの適用時にロックされます。そのロック中に、べき等 oplog クエリが oplog に書き込まれます。データベースは相互接続されておらず、一度に 1 つのクエリしかデータベースに適用できないため、データベースのロックで十分です。とにかく、2 つのデータ変更クエリを同じデータベースに同時に適用することはできないのに、なぜ oplog にロックを設定する必要があるのでしょうか?
どうやら、ローカル データベースがロックされているようです。ただし、データは既にロックされているため、その理由はわかりません。*ひっかく頭*