

# RDS for SQL Server での Microsoft 分散トランザクションコーディネーターのサポート
<a name="Appendix.SQLServer.Options.MSDTC"></a>

*分散トランザクション*は、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 のドキュメントの「[分散トランザクションコーディネーター](https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms684146(v=vs.85))」を参照してください。

**Contents**
+ [制限事項](#Appendix.SQLServer.Options.MSDTC.Limitations)
+ [MSDTC の有効化](Appendix.SQLServer.Options.MSDTC.Enabling.md)
  + [MSDTC のオプショングループの作成](Appendix.SQLServer.Options.MSDTC.Enabling.md#Appendix.SQLServer.Options.MSDTC.OptionGroup)
  + [オプショングループへの MSDTC オプションの追加](Appendix.SQLServer.Options.MSDTC.Enabling.md#Appendix.SQLServer.Options.MSDTC.Add)
  + [MSDTC のパラメータグループの作成](Appendix.SQLServer.Options.MSDTC.Enabling.md#MSDTC.CreateParamGroup)
  + [MSDTC のパラメータの変更](Appendix.SQLServer.Options.MSDTC.Enabling.md#ModifyParam.MSDTC)
  + [DB インスタンスとのオプショングループおよびパラメータグループの関連付け](Appendix.SQLServer.Options.MSDTC.Enabling.md#MSDTC.Apply)
  + [MSDTC オプションの変更](Appendix.SQLServer.Options.MSDTC.Enabling.md#Appendix.SQLServer.Options.MSDTC.Modify)
+ [トランザクションの使用](#Appendix.SQLServer.Options.MSDTC.Using)
  + [分散トランザクションの使用](#Appendix.SQLServer.Options.MSDTC.UsingXA)
  + [XA トランザクションの使用](#MSDTC.XA)
  + [トランザクションの追跡の使用](#MSDTC.Tracing)
+ [MSDTC の無効化](Appendix.SQLServer.Options.MSDTC.Disable.md)
+ [RDS for SQL Server の MSDTC のトラブルシューティング](Appendix.SQLServer.Options.MSDTC.Troubleshooting.md)

## 制限事項
<a name="Appendix.SQLServer.Options.MSDTC.Limitations"></a>

RDS for SQL Server で MSDTC を使用する場合は、次の制限が適用されます。
+ MSDTC は、SQL Server データベースミラーリングを使用するインスタンスではサポートされません。詳細については、「[トランザクション - 可用性グループとデータベースミラーリング](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/transactions-always-on-availability-and-database-mirroring?view=sql-server-ver15#non-support-for-distributed-transactions)」を参照してください。
+ `in-doubt xact resolution` パラメータは 1 または 2 に設定する必要があります。詳細については、「[MSDTC のパラメータの変更](Appendix.SQLServer.Options.MSDTC.Enabling.md#ModifyParam.MSDTC)」を参照してください。
+ MSDTC では、分散トランザクションに参加するすべてのホストをホスト名を使用して解決可能にする必要があります。RDS は、ドメインに参加しているインスタンスに対してこの機能を自動的に維持します。ただし、スタンドアロンインスタンスの場合は、必ず DNS サーバーを手動で設定してください。
+ Java Database Connectivity (JDBC) XA トランザクションは、SQL Server 2017 バージョン 14.00.3223.3 以降および SQL Server 2019 でサポートされています。
+ RDS インスタンス上のクライアント動的リンクライブラリ (DLL) に依存する分散トランザクションはサポートされていません。
+ カスタム XA 動的リンクライブラリの使用はサポートされていません。

## トランザクションの使用
<a name="Appendix.SQLServer.Options.MSDTC.Using"></a>

### 分散トランザクションの使用
<a name="Appendix.SQLServer.Options.MSDTC.UsingXA"></a>

Amazon RDS for SQL Server では、オンプレミスで実行されている分散トランザクションと同じ方法で分散トランザクションを実行します。
+ .NET フレームワークの `System.Transactions` 昇格可能トランザクションを使用します。これにより、必要になるまで作成を延期することで分散トランザクションが最適化されます。

  この場合、昇格は自動的に行われるため、ユーザーが介入する必要はありません。トランザクション内にリソースマネージャーが 1 つのみ存在する場合、昇格は実行されません。暗黙的なトランザクションスコープの詳細については、Microsoft ドキュメントの「[トランザクションスコープを使用した暗黙的なトランザクションの実装](https://docs.microsoft.com/en-us/dotnet/framework/data/transactions/implementing-an-implicit-transaction-using-transaction-scope)」を参照してください。

  昇格可能なトランザクションは、次の .NET 実装でサポートされています。
  + ADO.NET 2.0 以降、`System.Data.SqlClient` では SQL Server での昇格可能トランザクションをサポートしています。詳細については、Microsoft のドキュメントの「[SQL Server と System.Transations の統合](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/system-transactions-integration-with-sql-server)」を参照してください。
  + ODP.NET は `System.Transactions` をサポートしています。ローカルトランザクションは、Oracle Database 11g リリース 1 (バージョン11.1) 以降への `TransactionsScope` スコープで開かれた初期の接続に対して作成されます。2 番目の接続が開かれると、このトランザクションは自動的に分散トランザクションに昇格されます。ODP.NET での分散トランザクションのサポートの詳細については、Oracle ドキュメントの「[Microsoft Distributed Transaction Coordinator Integration](https://docs.oracle.com/en/database/oracle/oracle-data-access-components/18.3/ntmts/using-mts-with-oracledb.html)」を参照してください。
+ `BEGIN DISTRIBUTED TRANSACTION` ステートメントを使用します。詳細については、Microsoft のドキュメントの「[BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)](https://docs.microsoft.com/en-us/sql/t-sql/language-elements/begin-distributed-transaction-transact-sql)」を参照してください。

### XA トランザクションの使用
<a name="MSDTC.XA"></a>

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

### トランザクションの追跡の使用
<a name="MSDTC.Tracing"></a>

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` - 追跡アクション。`START`、`STOP` または `STATUS` のいずれかを設定できます。

以下のパラメータはオプションです。
+ `@traceall` - すべての分散トランザクションを追跡するには、1 に設定します。デフォルトは 0 です。
+ `@traceaborted` - キャンセルされた分散トランザクションを追跡するには、1 に設定します。デフォルトは 0 です。
+ `@tracelong` - 長時間実行される分散トランザクションを追跡するには、1 に設定します。デフォルトは 0 です。

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

```
exec msdb.dbo.rds_msdtc_transaction_tracing 'START',
@traceall='{{0}}',
@traceaborted='{{1}}',
@tracelong='{{1}}';
```
一度にアクティブにできるトランザクション追跡セッションは 1 つだけです。追跡セッションがアクティブなときに新しい追跡セッションの `START` コマンドが発行されると、エラーが返され、アクティブな追跡セッションは変更されません。

**Example 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 ログファイルのモニタリング](USER_LogAccess.md)」を参照してください。  
追跡セッションログは、インスタンスに 35 日間残されます。古い追跡セッションのログは自動的に削除されます。

**Example 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` のどちらかになります。