免責事項これは私の頭の中で一番上にあるので、間違いがあれば私を十字架にしてはいけません。しかし、私を修正してください。
なぜでしょうか?
- 前提:データベースは、定義により、
- oplog entries are always idempotent
- を相互に接続されていないOplogはcapped collection, with a guarantee of preserving the insert order
が適用されているのは、クエリの真の並列処理を想定してみましょうです。ですから、同時に2つのクエリが到着し、最初にoplogに挿入するクエリを決定する必要があります。ロックを取った最初の人が最初に書きます。ただし、問題があります。最初のクエリが単純なものであると仮定しましょうdb.collection.update({_id:"foo"},{$set:{"bar":"baz"}})
もう一方のクエリはより複雑であり、そのために正しいかどうかの評価に時間がかかります。だから、それを防ぐために、到着時にロックをにして、偶発的なoplogエントリが書き込まれた後にリリースする必要がありました。私はしかし、クエリが並列で適用されていない私の記憶
に依存する必要がどこここ
です。クエリはがキューに登録され、到着順に評価されます。データベースgetは、クエリオプティマイザを実行した後、クエリの適用時にロックされます。そのロック中に、冪等級のoplogクエリがoplogに書き込まれます。データベースは相互接続されておらず、常に1つのクエリしかデータベースに適用できないため、データベースのロックで十分です。
とにかく、同じデータベースに2つのデータ変更クエリを同時に適用することはできません。なぜ、oplogでロックを設定する必要がありますか?
明らかに、ロックはローカルデータベースを占有しています。しかし、すでにデータにロックがかけられているので、その理由はわかりません。* scratchingMyHead *
私はドキュメントを読んだが、それでも信じられない。 oplogのエントリは冪等で、データベースはアプリケーションでロックされているので、実際には必要ありません...私は実際にそれを取得しません。 –
このブログの投稿も読む価値があります。作者はリアルタイムメトリックシステムを開発するときにこの「グローバルロック」に遭遇しました。 – Jaco
リンクを忘れた場合:リンク:http://daprlabs.com/blog/blog/2014/04/19/mongodb/。ブロガーはマイクロソフトのために働き、彼の結論のいくつかは幾分偏っているように見えることに注意してください。 – Jaco