バージョン 5.0 での変更。
読み取り保証"snapshot"を指定したクエリでは、直近の特定の点のシャード全体に表示れる、過半数のコミット済みデータが返されます。 読み取り保証"snapshot"は、トランザクションが書込み保証 "majority"でコミットされた場合にのみ保証を提供します。
読み取り保証"snapshot"は、マルチドキュメントトランザクションと MongoDB 5.0 以降では、マルチドキュメントトランザクション外の特定の読み取り操作で使用できます。
トランザクションが因果関係がコンシステントなセッションの一部でない場合、書込み保証
"majority"によるトランザクションのコミット時に、トランザクション操作は、大多数がコミットされたデータのスナップショットから読み取られることが保証されます。トランザクションが因果関係がコンシステントなセッションの一部である場合、書込み保証
"majority"によるトランザクションのコミット時に、トランザクション操作は、トランザクションの開始直前の操作との因果整合性を提供する、大多数がコミットされたデータのスナップショットから読み取られることが保証されます。
重要
"snapshot" 読み取りは、minSnapshotHistoryWindowInSeconds で指定された期間内にのみ実行できます。minSnapshotHistoryWindowInSeconds より長く続く読み取り操作が終了する可能性があります。
マルチドキュメントトランザクション以外では、読み取り保証 "snapshot"は、次の読み取り操作のプライマリとセカンダリで使用できます。
他のすべての読み取りコマンドは、 "snapshot"を禁止しています。
操作
読み取り保証を受け入れるすべての操作のリストについては、「読み取り保証をサポートする操作 」を参照してください。
読み取り保証(read concern) とトランザクション
マルチドキュメントトランザクションは、読み取り保証"snapshot"だけでなく、 "local"と"majority"もサポートします。
注意
読み取り保証 (read concern) は、個々の操作レベルではなく、トランザクション レベルで設定します。トランザクションに読み取り保証 (read concern) を設定するには、「トランザクションと読み取り保証 (read concern)」を参照してください。
読み取り保証(read concern) と atClusterTime
マルチドキュメントトランザクション以外では、読み取り保証 (read concern) "snapshot" での読み取りは、任意パラメータ atClusterTime をサポートします。パラメータ atClusterTime を使用すると、読み取りのタイムスタンプを指定できます。指定された atClusterTime が T の読み取りリクエストを満たすには、mongod は時間 T に利用可能なデータに基づいてリクエストを実行します。mongod の oplog が時間 T にまだ達していない場合、リクエストを処理するまで待機します。
Tip
レプリカセットのノードの延遅に向けて読み取りが行われる場合、maxTimeMS を使用して、指定された atClusterTime で読み取りの待機時間に上限を設定できます。maxTimeMS により、操作が無期限にブロックされることはなく、代わりに mongod が指定された atClusterTime に時間内に達しない場合はエラーが返されます。
操作のoperationTimeまたはclusterTimeは、 db.runCommand()の応答またはSession()オブジェクトから取得できます。
次のコマンドは、読み取り保証(read concern "snapshot"を使用して検索操作を実行し、この操作がクラスター時間Timestamp(1613577600, 1)にスナップショットからデータを読み取る必要があることを指定します。
db.runCommand( { find: "restaurants", filter: { _id: 5 }, readConcern: { level: "snapshot", atClusterTime: Timestamp(1613577600, 1) }, } )
パラメータatClusterTimeが指定されていない場合、 mongos 、または単一ノード レプリカセットではmongodは、最新の 過半数がコミットしたスナップショット のタイムスタンプをatClusterTimeとして選択し、それをクライアントに返します。
トランザクション以外では、 "snapshot"の読み取りは、過半数がコミットされたデータから読み取られることが保証されます。
atClusterTime 考慮事項と動作
atClusterTimeに許可される値は、minSnapshotHistoryWindowInSecondsパラメータによって異なります。minSnapshotHistoryWindowInSecondsは、storage engineがスナップショット履歴を保持する最小時間枠を秒単位で示します。minSnapshotHistoryWindowInSecondsに従って保持されている最も古いスナップショットよりも古いatClusterTime値を指定すると、mongodはエラーを返します。遅延レプリカセット ノードに対して
"snapshot"を使用してatClusterTimeを指定せずに読み取り操作を実行すると、返される過半数がコミットしたデータが古い可能性があります。atClusterTimeを指定すると、mongodは古いデータを返すのではなく、指定されたタイムスタンプを待機しますが、読み取りがブロックされるか、タイムアウトする可能性があります。atClusterTime"snapshot"因果整合性のあるセッション 内では、 に指定することはできません。
Cappedコレクションに関する 読み取り保証 (read concern)
MongoDB 以降では、8.0 Capped"snapshot" コレクションで読み取り保証 (read concern) を使用できます。