RDS for SQL Server での Microsoft 分散トランザクションコーディネーターのサポート - Amazon Relational Database Service

RDS for SQL Server での Microsoft 分散トランザクションコーディネーターのサポート

分散トランザクションは、2 つ以上のネットワークホストが関与するデータベーストランザクションです。RDS for SQL Server では、ホスト間の分散トランザクションをサポートしています。この場合、ホストの 1 つとして次のいずれかを含みます。

  • RDS for SQL Server の DB インスタンス

  • オンプレミスの SQL Server ホスト

  • SQL Server がインストールされている Amazon EC2 ホスト

  • 分散トランザクションをサポートするデータベースエンジンを備えた他の EC2 ホストまたは RDS DB インスタンス

RDS では、SQL Server 2012 以降 (バージョン 11.00.5058.0.v1 以降)、RDS for SQL Server のすべてのエディションで分散トランザクションがサポートされています。サポートは、Microsoft 分散トランザクションコーディネーター (MSDTC) を使用して提供されます。MSDTC の詳細については、Microsoft のドキュメントの「分散トランザクションコーディネーター」を参照してください。

制限事項

RDS for SQL Server で MSDTC を使用する場合は、次の制限が適用されます。

  • MSDTC は、SQL Server データベースミラーリングを使用するインスタンスではサポートされません。詳細については、「トランザクション - 可用性グループとデータベースミラーリング」を参照してください。

  • in-doubt xact resolution パラメータは 1 または 2 に設定する必要があります。詳細については、「MSDTC のパラメータの変更」を参照してください。

  • MSDTC では、分散トランザクションに参加するすべてのホストをホスト名を使用して解決可能にする必要があります。RDS は、ドメインに参加しているインスタンスに対してこの機能を自動的に維持します。ただし、スタンドアロンインスタンスの場合は、必ず DNS サーバーを手動で設定してください。

  • Java Database Connectivity (JDBC) XA トランザクションは、SQL Server 2017 バージョン 14.00.3223.3 以降および SQL Server 2019 でサポートされています。

  • RDS インスタンス上のクライアント動的リンクライブラリ (DLL) に依存する分散トランザクションはサポートされていません。

  • カスタム XA 動的リンクライブラリの使用はサポートされていません。

トランザクションの使用

分散トランザクションの使用

Amazon RDS for SQL Server では、オンプレミスで実行されている分散トランザクションと同じ方法で分散トランザクションを実行します。

  • .NET フレームワークの System.Transactions 昇格可能トランザクションを使用します。これにより、必要になるまで作成を延期することで分散トランザクションが最適化されます。

    この場合、昇格は自動的に行われるため、ユーザーが介入する必要はありません。トランザクション内にリソースマネージャーが 1 つのみ存在する場合、昇格は実行されません。暗黙的なトランザクションスコープの詳細については、Microsoft ドキュメントの「トランザクションスコープを使用した暗黙的なトランザクションの実装」を参照してください。

    昇格可能なトランザクションは、次の .NET 実装でサポートされています。

    • ADO.NET 2.0 以降、System.Data.SqlClient では SQL Server での昇格可能トランザクションをサポートしています。詳細については、Microsoft のドキュメントの「SQL Server と System.Transations の統合」を参照してください。

    • ODP.NET は System.Transactions をサポートしています。ローカルトランザクションは、Oracle Database 11g リリース 1 (バージョン11.1) 以降への TransactionsScope スコープで開かれた初期の接続に対して作成されます。2 番目の接続が開かれると、このトランザクションは自動的に分散トランザクションに昇格されます。ODP.NET での分散トランザクションのサポートの詳細については、Oracle ドキュメントの「Microsoft Distributed Transaction Coordinator Integration」を参照してください。

  • BEGIN DISTRIBUTED TRANSACTION ステートメントを使用します。詳細については、Microsoft のドキュメントの「BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)」を参照してください。

XA トランザクションの使用

RDS for SQL Server 2017 バージョン 14.00.3223.3 以降、JDBC を使用して分散トランザクションを制御できます。MSDTC オプションで Enable XA オプション設定をtrue に設定すると、RDS では JDBC トランザクションが自動的に有効化され、SqlJDBCXAUser ロールが guest ユーザーに付与されます。これにより、JDBC を使用した分散トランザクションの実行が可能になります。コード例も含めた詳細については、Microsoft のドキュメントの「XA トランザクションについて」を参照してください。

トランザクションの追跡の使用

RDS では、トラブルシューティングの目的で MSDTC トランザクションの追跡を制御し、RDS DB インスタンスからこれらをダウンロードできます。トランザクションの追跡セッションは、次の RDS ストアドプロシージャを実行することで制御できます。

exec msdb.dbo.rds_msdtc_transaction_tracing 'trace_action', [@traceall='0|1'], [@traceaborted='0|1'], [@tracelong='0|1'];

以下のパラメータは必須です。

  • trace_action - 追跡アクション。STARTSTOP または STATUS のいずれかを設定できます。

以下のパラメータはオプションです。

  • @traceall - すべての分散トランザクションを追跡するには、1 に設定します。デフォルトは 0 です。

  • @traceaborted - キャンセルされた分散トランザクションを追跡するには、1 に設定します。デフォルトは 0 です。

  • @tracelong - 長時間実行される分散トランザクションを追跡するには、1 に設定します。デフォルトは 0 です。

例 START 追跡アクション例

新しいトランザクション追跡セッションをスタートするには、次のステートメント例を実行します。

exec msdb.dbo.rds_msdtc_transaction_tracing 'START', @traceall='0', @traceaborted='1', @tracelong='1';
注記

一度にアクティブにできるトランザクション追跡セッションは 1 つだけです。追跡セッションがアクティブなときに新しい追跡セッションの START コマンドが発行されると、エラーが返され、アクティブな追跡セッションは変更されません。

例 STOP 追跡アクション例

トランザクション追跡セッションを停止するには、次のステートメントを実行します。

exec msdb.dbo.rds_msdtc_transaction_tracing 'STOP'

このステートメントは、アクティブなトランザクション追跡セッションを停止し、トランザクション追跡データを RDS DB インスタンスのログディレクトリに保存します。出力の初期の行には全体的な結果が含まれ、後続の行はオペレーションの詳細を示します。

追跡セッションが正常に停止した例を次に示します。

OK: Trace session has been successfully stopped. Setting log file to: D:\rdsdbdata\MSDTC\Trace\dtctrace.log Examining D:\rdsdbdata\MSDTC\Trace\msdtctr.mof for message formats, 8 found. Searching for TMF files on path: (null) Logfile D:\rdsdbdata\MSDTC\Trace\dtctrace.log: OS version 10.0.14393 (Currently running on 6.2.9200) Start Time <timestamp> End Time <timestamp> Timezone is @tzres.dll,-932 (Bias is 0mins) BufferSize 16384 B Maximum File Size 10 MB Buffers Written Not set (Logger may not have been stopped). Logger Mode Settings (11000002) ( circular paged ProcessorCount 1 Processing completed Buffers: 1, Events: 3, EventsLost: 0 :: Format Errors: 0, Unknowns: 3 Event traces dumped to d:\rdsdbdata\Log\msdtc_<timestamp>.log

詳細情報を使用して、生成されたログファイル名のクエリを実行できます。RDS DB インスタンスからのログファイルのダウンロードの詳細については、「Amazon RDS ログファイルのモニタリング」を参照してください。

追跡セッションログは、インスタンスに 35 日間残されます。古い追跡セッションのログは自動的に削除されます。

例 STATUS 追跡アクション例

トランザクション追跡セッションのステータスを追跡するには、次のステートメントを実行します。

exec msdb.dbo.rds_msdtc_transaction_tracing 'STATUS'

このステートメントは、結果セットの個別の行として以下を出力します。

OK SessionStatus: <Started|Stopped> TraceAll: <True|False> TraceAborted: <True|False> TraceLongLived: <True|False>

初期の行は、操作の全体的な結果を示します。該当する場合は OK または ERROR と詳細も表示されます。後続の行は、追跡セッションのステータスに関する詳細を示します。

  • SessionStatus の値は次のいずれかを指定できます。

    • Started追跡セッションが実行中の場合は 。

    • Stopped実行中の追跡セッションがない場合は 。

  • 追跡セッションフラグは、True コマンドでの設定方法によって False または START のどちらかになります。