シャーディングされたクラスターでマルチドキュメントトランザクションを実行できます。
以下のページでは、シャーディングされたクラスターでトランザクションを実行する際に固有の懸念事項を示します。 これらの懸念事項は、 「 本番環境での考慮事項 」に記載されている考慮事項に追加されます。
パフォーマンス
シングル シャード
単一のシャードを対象とするトランザクションは、レプリカセットのトランザクションと同じパフォーマンスを持つ必要があります。
複数のシャード
複数のシャードに影響するトランザクションの場合、パフォーマンス コストが高くなります。
注意
シャーディングされたクラスターでは、関係するシャードにアービタが含まれていると、複数のシャードにまたがるトランザクションはエラーとなり中止します。
時間制限
時間制限を指定するには、 commitTransactionにmaxTimeMSの制限を指定します。
maxTimeMSが指定されていない場合、MongoDB はtransactionLifetimeLimitSecondsを使用します。
maxTimeMSが指定されているがtransactionLifetimeLimitSecondsを超えるトランザクションが発生する場合、MongoDB はtransactionLifetimeLimitSecondsを使用します。
シャーディングされたクラスターのtransactionLifetimeLimitSecondsを変更するには、すべてのシャード レプリカセットのノード パラメーターを変更する必要があります。
読み取り保証(read concern)
マルチドキュメントトランザクションは、 "local" 、 "majority" 、 "snapshot"の読み取り保証レベルをサポートしています。
シャーディングされたクラスター上のトランザクションの場合、 "snapshot"読み取り保証のみが複数のシャード間で一貫したスナップショットを提供します。
読み取り保証とトランザクションの詳細については、「トランザクションと読み取り保証 」を参照してください。
書込み保証 (write concern)
シャーディングされたクラスターでトランザクションを実行するには、writeConcernMajorityJournalDefault をtrue に設定する必要があります。
注意
トランザクションに指定された書込み保証(write concern) にかかわらず、シャーディングされたトランザクションのコミット操作の一部には、 {w: "majority", j: true}書込み保証を使用する部分が含まれます。
アービタ
アービタはデータを含まないレプリカを投票しているため、 MongoDB はデータを保護し、レプリカセットにアービタが含まれるシャードを対象とするマルチシャード データトランザクションを防止します。これには、トランザクションを使用したシャードキーの変更が含まれます。
MongoDB は、アービタ を含むシャードを対象に読み取りまたは書込み操作される場合、その書込み操作が複数のシャードにまたがるトランザクションをブロックします。
バックアップと復元
警告
mongodumpとmongorestore をシャーディングされたクラスターのバックアップ戦略として使用するには、「 データベース ダンプを使用した自己管理型シャードクラスタのバックアップ 」を参照してください。
シャーディングされたクラスターではバックアップと復元に次のいずれかの連携的なプロセスも利用できます。これによりシャード間のトランザクションはアトミック性が継続的に保証されます。
チャンクの移行
チャンクの移行では、特定の段階で排他的なコレクション ロックが取得されます。
進行中のトランザクションでコレクションがロックされ、そのコレクションを含むチャンクの移行が開始された場合、これらの移行段階では、トランザクションがコレクションのロックを解放するまで待つ必要があるため、チャンクの移行のパフォーマンスに影響します。
チャンクの移行がトランザクションとインターリーブする場合(たとえば、チャンクの移行がすでに進行中のときにトランザクションが開始され、トランザクションがコレクションをロックする前に移行が完了した場合)、トランザクションはコミット中にエラーになり、中止されます。
2 つの操作がどのようにインターリーブされるかによって、次のようなエラーが出ます(エラーメッセージは省略されています)。
an error from cluster data placement change ... migration commit in progress for <namespace>Cannot find shardId the chunk belonged to at cluster time ...
コミット中の外部読み取り
トランザクションのコミット中に、外部の読み取り操作が、トランザクションによって変更される同じドキュメントを読み込もうとする場合があります。トランザクションが複数のシャードに書き込まれる場合、シャード間でのコミット試行中に次のことが起きます。
読み取り保証 (read concern)
"snapshot"または"linearizable"を使用する外部読み取りは、トランザクションのすべての書込み (write) が表示可能になるまで待機します。因果的にコンシステントなセッション (afterClusterTime を含むもの)の一部である外部読み取りは、トランザクションのすべての書込みが表示可能になるまで待機します。
他の読み取り方法を使用した外部読み取りは、トランザクションのすべての書込みが表示されるまで待たずに、トランザクション前のバージョンのドキュメントを読み取ります。