

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# RDS for SQL Server 中的 Microsoft Distributed Transaction Coordinator 支援
<a name="Appendix.SQLServer.Options.MSDTC"></a>

*分散式交易*是涉及兩個或多個網路主機的資料庫交易。RDS for SQL Server 支援主機之間的分散式交易，其中單一主機可以是下列其中一項：
+ RDS for SQL Server 資料庫執行個體
+ 內部部署 SQL Server 主機
+ 已安裝 SQL Server 的 Amazon EC2 主機
+ 任何其他具有支援分散式交易之資料庫引擎的 EC2 主機或 RDS 資料庫執行個體

在 RDS 中，自 SQL Server 2012 (11.00.5058.0.v1 版及更新版本) 開始，RDS for SQL Server 的所有版本都支援分散式交易。支援是使用 Microsoft Distributed Transaction Coordinator (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)
  + [將選項群組和參數群組與資料庫執行個體建立關聯](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 時適用下列限制：
+ 使用 SQL Server 資料庫鏡像的執行個體不支援 MSDTC。如需詳細資訊，請參閱[交易 - 可用性群組和資料庫鏡像](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 伺服器。
+ SQL Server 2017 14.00.3223.3 版和更新版本以及 SQL Server 2019 支援 Java Database Connectivity (JDBC) XA 交易。
+ 在 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 Framework `System.Transactions` 可升級的交易，透過延遲到有需要時再建立交易，可最佳化分散式交易。

  在這種情況下，升級是自動的，而不需要您進行任何干預。如果交易中只有一個資源管理員，則不會執行任何升級。如需隱含交易範圍的詳細資訊，請參閱 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.Transactions 整合](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/system-transactions-integration-with-sql-server)。
  + ODP.NET 支援 `System.Transactions`。在 `TransactionsScope` 範圍中對 Oracle 資料庫 11g 版本 1 (11.1 版) 及更新版本開啟的第一個連線會建立本機交易。當開啟第二個連線時，會自動將此交易升級為分散式交易。如需 ODP.NET 中的分散式交易支援的詳細資訊，請參閱 Microsoft 文件中的 [Microsoft Distributed Transaction Coordinator 整合](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 資料庫執行個體下載追蹤以進行故障診斷。您可以執行下列 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 開始追蹤動作**  
若要開始新的交易追蹤工作階段，請執行下列範例陳述式。  

```
exec msdb.dbo.rds_msdtc_transaction_tracing 'START',
@traceall='{{0}}',
@traceaborted='{{1}}',
@tracelong='{{1}}';
```
一次只能使用一個交易追蹤工作階段。如果在追蹤工作階段作用中時發出新的追蹤工作階段 `START` 命令，則會傳回錯誤，且使用中的追蹤工作階段會維持不變。

**Example 停止追蹤動作**  
若要停止交易追蹤工作階段，請執行下列陳述式。  

```
exec msdb.dbo.rds_msdtc_transaction_tracing 'STOP'
```
此陳述式會停止作用中的交易追蹤工作階段，並將交易追蹤資料儲存至 RDS 資料庫執行個體上的日誌目錄。輸出的第一列包含整體結果，後續幾行指出該操作的詳細資訊。  
以下是成功停止追蹤工作階段的範例。  

```
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 資料庫執行個體下載日誌檔案的詳細資訊，請參閱 [監控 Amazon RDS 日誌檔案](USER_LogAccess.md)。  
追蹤工作階段記錄會在執行個體上保留 35 天。系統會自動刪除任何較舊的追蹤工作階段日誌。

**Example 狀態追蹤動作**  
若要追蹤交易追蹤工作階段的狀態，請執行下列陳述式。  

```
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` 命令中的設定方式。