AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

因果整合性と、読み取り保証(read concern)および書込み保証(write concern)

MongoDB の因果関係の整合性があるクライアント セッションでは、読み取り保証 (read concern) と書込み保証 (write concern) の異なる組み合わせによって、さまざまな因果整合性の保証が提供されます。

次の表は、さまざまな組み合わせによって提供される具体的な保証を示しています。

読み取り保証(read concern)
書込み保証 (write concern)
自分の書込み (write) 操作の結果を読み取る
単調な読み取り
単調書込み
書込み操作の前に読み取り操作をする

✅

✅

✅

✅

✅

✅

✅

データの耐久性と因果整合性が必要な場合は、表からわかるように、"majority" 読み取り保証 (read concern) のある読み取り操作と、"majority" 書込み保証 (write concern) のある書き込み操作のみが、4 つの因果整合性保証をすべて保証できます。つまり、因果関係の整合性があるクライアント セッションは、以下の場合のみ因果整合性が保証されます。

  • "majority" 読み取り保証 (read concern) のある読み取り操作。つまりレプリカセット ノードの過半数によって確認されたデータを返し、耐久性がある読み取り操作。

  • "majority" 書き込み保証付き書込み操作。つまり、レプリカセットの投票ノードの過半数に操作が適用済みであることを確認するようリクエストする書込み操作です。

データの耐久性を持たずに因果整合性を維持したい(つまり、書込み (write) がロールバックされる可能性がある)場合は、{ w: 1 } 書込み保証 (write concern) のある書き込み操作でも因果整合性を提供できます。

注意

読み取り保証 (read concern) と書込み保証 (write concern) の他の組み合わせでも、状況によっては 4 つの因果整合性の保証がすべて満たされる場合がありますが、必ずしもすべての状況に当てはまるとは限りません。

読み取り保証 (read concern) "majority" と書込み保証 (write concern) "majority" により、レプリカセット内の 2 つのノードが一時的にプライマリであると認識する状況(ネットワークパーティションがあるなど)でも、4 つの因果整合性の保証が保持されます。両方のプライマリが{ w: 1 }書き込み懸念で書き込みを完了できますが、 "majority"書き込み懸念で書き込みを完了できるのは 1 つのプライマリのみです。

たとえば、ネットワークパーティションが 5 つのノードのレプリカセットを分割する状況を考えます。

ネットワークパーティション: 一方で新しいプライマリが選出されたが、古いプライマリはまだ降格していない。
クリックして拡大します

例

上記のパーティションで

  • "majority" 書込み保証 (write concern) を使用する書込み (write) は、P new では完了できますが、P old では完了できません。

  • { w: 1 } 書込み保証 (write concern) を使用する書込み (write) は、P old または P new のいずれかで完了できます。ただし、P old への書込み(および S 1 に複製された書込み)は、これらのノードが残りのレプリカセットとの通信を回復するとロールバックされます。

  • P new に対して "majority" 書込み保証 (write concern) を使用した 書込み (write) が成功すると、"majority" 読み取り保証 (read concern) を使用した因果整合性のある読み取りは、P new、S 2 および S 3 に対する書込みを観察できます。読み取りは、残りのレプリカセットと通信できるようになり、レプリカセットの他のノードと同期できるようになると、P old と S 1 に対する書込みも観察できます。パーティション中に P old に行われた書込みや S 1 に複製された書込みはすべてロールバックされます。

読み取り保証 (read concern)/書込み保証 (write concern) に関する要件を説明するため、次のシナリオで、レプリカセットに対しさまざまな読み取り保証と書込み保証の組み合わせを使用して操作のシーケンスを発行するクライアントを示します。

因果整合性のあるセッションで読み取り保証 (read concern) "majority" と書込み保証 (write concern) "majority" を使用すると、次の因果整合性が保証されます。

✅ 自分の書込み操作結果の読み取り ✅ 単調な読み取り ✅ 単調な書込み ✅ 読み取り操作の結果の書込み

注意

シナリオ 1(読み取り保証 (read concern) "majority" と書込み保証 (write concern) "majority")

2 つのプライマリがある過渡期間中、P new ノードのみが { w: "majority" } 書込み保証 (write concern) で書込み (write) を実行できるため、クライアント セッションは次の操作のシーケンスを正常に発行できます。

シーケンス
例





1。書込み保証 (write concern) "majority"を使用して 1 と P 新しい 2 を書込みます。読み取り保証 (read concern) "majority" から S 2 3 を使用して 1 を読み取ります。書込み保証 (write concern) "majority" を使用して 2 と P 新しい 4 を書込みます。読み取り保証 (read concern) "majority" から S 3 を使用して読み取り 2 を実行します

Aqty50
アイテムA の場合、
を に更新します。アイテム を読み取る。 がqty 50より小さいアイテムは、
をrestock trueに更新します。アイテム
Aを読み取る。

書込み保証 (write concern) と読み取り保証 (read concern) majority を使用する 2 つのプライマリによるデータの状態
クリックして拡大します

✅ 自分の書込み操作結果の読み取り

読み取り 1 は、S 2 からデータを読み取ります。このデータは書き込み (write) 1 後の状態を反映しています。
読み取り 2 は、S 3 からデータを読み取ります。このデータは書き込み (write) 1 とその後の書き込み (write) 2 後の状態を反映しています。

✅ 単調な読み取り

読み取り 2 は、S 3 から、読み取り 1 後の状態を反映しているデータを読み取ります。

✅ 単調な書込み

書込み 2 は、P new に、書込み 1 後の状態を反映しているデータを更新します。

✅ 読み取り操作の結果の書込み

書き込み2は、読み取り 1 後のデータの状態を反映しているデータを P new に更新します(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。

注意

シナリオ 2(読み取り保証 (read concern) "majority" と書込み保証 (write concern) "majority")

読み取り保証 "majority" を使用する読み取り 1 が S 1 にルーティングされる別のシーケンスを検討します。

シーケンス
例

1。書込み保証1 (write concern)"majority" を使用して とP 新しい
2 1"majority"S1
3を書込みます。読み取り保証2 (read concern)"majority" Pから を使用して

4 を読み取ります。書込み保証 (write concern) を使用して2 と 新しい を書込みます。読み取り保証 (read concern)"majority" から で読み取り を読み取りS3

Aqty50
アイテムA の場合、
を に更新します。アイテム を読み取る。 がqty 50より小さいアイテムは、
をrestock trueに更新します。アイテム
Aを読み取る。

このシーケンスでは、マジョリティ コミット ポイントが P old に進むまで、読み取り 1 は戻ることができません。これは、P old と S 1 が残りのレプリカセットと通信できるようになるまで発生しません。その時点で、P old は(まだの場合)降格し、2 つのノードはレプリカセットの他のノードから同期します(書込み 1 を含む)。

✅ 自分の書込み操作結果の読み取り

読み取り 1 は、ネットワークパーティションが修復され、メンバーがレプリカセットの他のノードと同期した後であっても、書き込み 1 後のデータの状態を反映します。

読み取り 2 は、書込み 1 とそれに続く書込み 2 の後の状態を反映しているデータを S 3 から読み取ります。

✅ 単調な読み取り

読み取り 2 は、読み取り 1 後の状態を反映しているデータを S 3 から読み取ります(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。

✅ 単調な書込み

書込み 2 は、P new に、書込み 1 後の状態を反映しているデータを更新します。

✅ 読み取り操作の結果の書込み

書き込み2は、読み取り 1 後のデータの状態を反映しているデータを P new に更新します(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。

データの耐久性のある因果整合性が必要な場合、因果整合性があるセッションで読み取り保証 (read concern) "majority" と書込み保証 (write concern) { w: 1 } を使用すると、次の因果整合性が保証されます。

❌ 自分の書込み操作結果の読み取り ✅ 単調な読み取り ❌ 単調な書込み ✅ 読み取り操作の結果の書込み

データの耐久性のない因果整合性が必要な場合:

✅ 自分の書込み操作結果の読み取り ✅ 単調な読み取り ✅ 単調な書込み ✅ 読み取り操作の結果の書込み

注意

シナリオ 3(読み取り保証 (read concern) "majority" と 書込み保証 (write concern) {w: 1})

2 つのプライマリがある過渡期間中、P old と P new の両方が { w: 1 } 書込み保証を使用する書込みを実行できるため、クライアント セッションは次の操作のシーケンスを正常に発行できますが、データの耐久性のある因果整合性が必要な場合、因果整合性は得られません。

シーケンス
例





1。 P old 2 への書込み保証 (write concern){ w: 1 } を持つ書込み 1 の書込み読み取り保証 (read concern) "majority" から S 2 3 を使用して 1 を読み取ります。書込み保証 (write concern) { w: 1 } を使用して 2 と P 新しい 4 を書込みます。読み取り保証 (read concern) "majority" から S 3 で読み取り 2 を読み取り

Aqty50
アイテムA の場合、
を に更新します。アイテム を読み取る。 がqty 50より小さいアイテムは、
をrestock trueに更新します。アイテム
Aを読み取る。

読み取り保証 (read concern) majority と書込み保証 (write concern) 1 を使用する 2 つのプライマリによるデータの状態
クリックして拡大します

このシーケンスでは、

  • 読み取り 1 は、マジョリティ コミット ポイントが書込み 1 の時点を過ぎて P new に進むまで、戻ることができません。

  • 読み取り 2 は、マジョリティ コミット ポイントが書込み 2 の時点を過ぎて P new に進むまで、戻ることができません。

  • 書込み 1 は、ネットワークパーティションが回復するとロールバックします。

➤ データの耐久性のある因果整合性が必要な場合

❌ 自分の書込み操作結果の読み取り

読み取り 1 は、書込み 1 後の状態を反映していないデータを S 2 から読み取ります。

✅ 単調な読み取り

読み取り 2 は、読み取り 1 後の状態を反映しているデータを S 3 から読み取ります(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。

❌ 単調書込み

書込み 2 は、書込み 1 後の状態を反映していないデータを P new に更新します。

✅ 読み取り操作の結果の書込み

書込み 2 は、読み取り 1 後の状態を反映しているデータを P new に更新します(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。

➤ データの耐久性のない因果整合性が必要な場合

✅ 自分の書込み操作結果の読み取り

1読み取りS2 1は、書込み1 とそれに続く書込み のロールバックと同等の状態を反映しているデータを から読み取ります。

✅ 単調な読み取り

読み取り 2 は、読み取り 1 後の状態を反映しているデータを S 3 から読み取ります(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。

✅ 単調な書込み

書込み 2 は、書込み 1 とそれに続く書込み 1 のロールバックと同等のデータを P new に更新します。

✅ 読み取り操作の結果の書込み

書込み 2 は、読み取り 1 後の状態を反映しているデータを P new に更新します(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。

注意

シナリオ 4(読み取り保証 (read concern) "majority" と 書込み保証 (write concern) {w: 1})

読み取り保証 "majority" を使用する読み取り 1 が S 1 にルーティングされる別のシーケンスを検討します。

シーケンス
例





1。 P old 2 への書込み保証 (write concern){ w: 1 } を持つ書込み 1 の書込み読み取り保証 (read concern) "majority" から S 1 3 を使用して 1 を読み取ります。書込み保証 (write concern) { w: 1 } を使用して 2 と P 新しい 4 を書込みます。読み取り保証 (read concern) "majority" から S 3 で読み取り 2 を読み取り

Aqty50
アイテムA の場合、
を に更新します。アイテム を読み取る。 がqty 50より小さいアイテムは、
をrestock trueに更新します。アイテム
Aを読み取る。

このシーケンスでは、

  • マジョリティ コミット ポイントが S 1 に進むまで、読み取り 1 は戻ることができません。これは、P old および S 1 が残りのレプリカセットと通信できるようになるまで発生しません。その時点で、P old は(まだ停止していない場合)停止し、書込み 1 は P old と S 1 からロールバックされ、2 つのノードはレプリカセットの他のノードから同期されます。

➤ データの耐久性のある因果整合性が必要な場合

❌ 自分の書込み操作結果の読み取り

読み取り 1 で読み取られたデータは、ロールバックした書込み 1 の結果を反映していません。

✅ 単調な読み取り

読み取り 2 は、読み取り 1 後の状態を反映しているデータを S 3 から読み取ります(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。

❌ 単調書込み

書込み 2 は、書込み 1 後の状態(つまり、書込み 2 の前に行われたがロールバックした)を反映していないデータを P new に更新します。

✅ 読み取り操作の結果の書込み

書込み 2 は、読み取り 1 後の状態を反映しているデータを P new に更新します(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。

➤ データの耐久性のない因果整合性が必要な場合

✅ 自分の書込み操作結果の読み取り

読み取り 1 は、書込み 1 が最終的にロールバックするため、書込み 1 の最終結果を反映するデータを返します。

✅ 単調な読み取り

読み取り 2 は、読み取り 1 後の状態を反映しているデータを S 3 に更新します(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。

✅ 単調な書込み

書込み 2 は、書込み 1 とそれに続く書込み 1 のロールバックと同等のデータを P new に更新します。

✅ 読み取り操作の結果の書込み

書込み 2 は、読み取り 1 後の状態を反映しているデータを P new に更新します(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。

因果整合性のあるセッションで読み取り保証 (read concern) "local" と書込み保証 (write concern) { w: 1 } を使用する場合、因果整合性は保証されません。

❌ 自分の書込み操作結果の読み取り ❌ 単調な読み取り ❌ 単調な書込み ❌ 読み取り操作の結果の書込み

この組み合わせは、状況によっては 4 種類の因果整合性保証をすべて満たすことがありますが、必ずしもすべての状況に当てはまるとは限りません。

注意

シナリオ 5(読み取り保証 (read concern) "local" と 書込み保証 (write concern) {w: 1})

この過渡期間中、P old と P new の両方が { w: 1 } 書込み保証 (write concern) を使用する書込み (write) を実行できるため、クライアント セッションは次の操作のシーケンスを正常に発行できますが、因果整合性はありません。

シーケンス
例

1。1 { w: 1 }Pold への書込み保証 (write concern)
2 を持つ書込み の書込み読み取り保証1 (read concern) から"local" を使用してS1
3 を読み取ります。書込み保証2 (write concern){ w: 1 } を使用してP と 新しい

4 を書込みます。読み取り保証2 (read concern) から"local" を使用して読み取り を実行しますS3

Aqty50
アイテムA の場合、
を に更新します。アイテム を読み取る。 がqty 50より小さいアイテムは、
をrestock trueに更新します。アイテム
Aを読み取る。

読み取り保証 (read concern) local と書込み保証 (write concern) 1 を使用する 2 つのプライマリによるデータの状態
クリックして拡大します

❌ 自分の書込み操作結果の読み取り

読み取り 2 は、書込み 1 とそれに続く書込み 2 ではなく、書込み 2 後の状態を反映しているデータを S 3 から読み取ります。

❌ 単調な読み取り

読み取り 2 は、読み取り 1 後の状態を反映していないデータを S 3 に更新します(つまり、読み取り 1 が読み取ったデータを反映していない「以前の」状態のデータ)。

❌ 単調な書き込み

書込み 2 は、書込み 1 後の状態を反映していないデータを P new に更新します。

❌ 読み取り操作の結果の書込み

書込み 2 は、読み取り 1 後の状態を反映していないデータを P new に更新します(つまり、読み取り 1 が読み取ったデータを反映していない「以前の」状態のデータ)。

因果整合性のあるセッションで読み取り保証 (read concern) "local" と書込み保証 (write concern) "majority" を使用すると、次の因果整合性が保証されます。

❌ 自分の書込み操作結果の読み取り ❌ 単調な読み取り ✅ 単調な書込み ❌ 読み取り操作の結果の書込み

この組み合わせは、状況によっては 4 種類の因果整合性保証をすべて満たすことがありますが、必ずしもすべての状況に当てはまるとは限りません。

注意

シナリオ 6(読み取り保証 (read concern) "local" と 書込み保証 (write concern) "majority")

この過渡期間中、P new は { w: "majority" } 書込み保証 (write concern) を使用する書込み (write) を実行できるため、クライアント セッションは次の操作のシーケンスを正常に発行できますが、因果整合性はありません。

シーケンス
例





1。書込み保証 (write concern) "majority"を使用して 1 と P 新しい 2 を書込みます。読み取り保証 (read concern) "local" から S 1 3 を使用して 1 を読み取ります。書込み保証 (write concern) "majority" を使用して 2 と P 新しい 4 を書込みます。読み取り保証 (read concern) "local" から S 3 を使用して読み取り 2 を実行します

Aqty50
アイテムA の場合、
を に更新します。アイテム を読み取る。 がqty 50より小さいアイテムは、
をrestock trueに更新します。アイテム
Aを読み取る。

読み取り保証 (read concern) local と書込み保証 (write concern) majority を使用する 2 つのプライマリによるデータの状態
クリックして拡大します

❌ 自分の書込み操作結果の読み取り

読み取り 1 は、書込み 1 後の状態を反映していないデータを S 1 から読み取ります。

❌ 単調な読み取り

読み取り 2 は、読み取り 1 後の状態を反映していないデータを S 3 に更新します(つまり、読み取り 1 が読み取ったデータを反映していない「以前の」状態のデータ)。

✅ 単調な書込み

書込み 2 は、P new に、書込み 1 後の状態を反映しているデータを更新します。

❌ 読み取り操作の結果の書込み

書込み 2 は、読み取り 1 後の状態を反映していないデータを P new に更新します(つまり、読み取り 1 が読み取ったデータを反映していない「以前の」状態のデータ)。

このページを評価