読み取り保証 (read concern) "snapshot"
項目一覧
バージョン 5.0 での変更。
読み取り保証 "snapshot"
を指定したクエリでは、直近の特定の点のシャード全体に表示れる、過半数のコミット済みデータが返されます。読み取り保証 "snapshot"
は、トランザクションが書込み保証 "majority"
でコミットされた場合にのみ保証を提供します。
読み取り保証"snapshot"
は、マルチドキュメントトランザクションと MongoDB 5.0 以降では、マルチドキュメントトランザクション外の特定の読み取り操作で使用できます。
トランザクションが因果関係がコンシステントなセッションの一部でない場合、書込み保証
"majority"
によるトランザクションのコミット時に、トランザクション操作は、大多数がコミットされたデータのスナップショットから読み取られることが保証されます。トランザクションが因果関係がコンシステントなセッションの一部である場合、書込み保証
"majority"
によるトランザクションのコミット時に、トランザクション操作は、トランザクションの開始直前の操作との因果整合性を提供する、大多数がコミットされたデータのスナップショットから読み取られることが保証されます。
マルチドキュメントトランザクション以外では、読み取り保証"snapshot"
は、次の読み取り操作のプライマリとセカンダリで使用できます。
他のすべての読み取りコマンドは、 "snapshot"
を禁止しています。
操作
読み取り保証を受け入れるすべての操作のリストについては、「読み取り保証をサポートする操作 」を参照してください。
スナップショット分離の制限
読み取り保証 (read concern "snapshot"
を使用した読み取り操作は、読み取り操作内にコレクションに対して同時削除または名前変更操作がない場合にのみスナップショットの分離を保証します。 ほとんどの場合、MongoDB は、操作によって読み取りスナップショットよりも先にコレクションが削除されたことを検出し、 SnapshotUnavailable
エラーを報告します。 この検出が不可能な場合は、スナップショットの実行中にコレクションが存在していても、読み取り操作は削除されたコレクションまたは名前変更されたコレクションを反映します。 この制限は、マルチドキュメントトランザクション内と外の操作のすべての読み取り保証に適用されます。
読み取り保証(read concern) とトランザクション
マルチドキュメントトランザクションは、読み取り保証"snapshot"
だけでなく、 "local"
と"majority"
もサポートします。
注意
読み取り保証 (read concern) は、個々の操作レベルではなく、トランザクション レベルで設定します。トランザクションに読み取り保証 (read concern) を設定するには、「トランザクションと読み取り保証 (read concern)」を参照してください。
読み取り保証 (read concern) とatClusterTime
バージョン 5.0 で追加
マルチドキュメントトランザクション以外では、読み取り保証(read concern) "snapshot"
を使用する読み取りは任意のパラメータatClusterTime
をサポートします。 パラメーターatClusterTime
を使用すると、読み取りのタイムスタンプを指定できます。 指定されたatClusterTime
の T で読み取りリクエストを満たすには、 mongod
は T 時に利用可能なデータに基づいてリクエストを実行します。
操作の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
"snapshot"
因果整合性のあるセッション 内では、 に指定することはできません。
Cappedコレクションに関する 読み取り保証 (read concern)
バージョン5.0 以降、"snapshot"
Capped コレクションから読み取るときに読み取り保証 を使用できません。