

# Compatibilidad con el Coordinador de transacciones distribuidas de Microsoft en RDS for SQL Server
<a name="Appendix.SQLServer.Options.MSDTC"></a>

Una *transacción distribuida* es una transacción de base de datos en la que participan dos o más anfitriones de red. RDS for SQL Server admite transacciones distribuidas entre anfitriones, donde un solo anfitrión puede ser uno de los siguientes:
+ Instancia de base de datos de RDS para SQL Server
+ Host local de SQL Server
+ Host de Amazon EC2 con SQL Server instalado
+ Cualquier otro host de EC2 o instancia de base de datos de RDS con un motor de base de datos que admita transacciones distribuidas

En RDS, a partir de SQL Server 2012 (versión 11.00.5058.0.v1 y posterior), todas las ediciones de RDS for SQL Server admiten transacciones distribuidas. La compatibilidad se proporciona con el Coordinador de transacciones distribuidas de Microsoft (MSDTC). Para obtener información detallada acerca de MSDTC, consulte [Distributed Transaction Coordinator](https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms684146(v=vs.85)) en la documentación de Microsoft.

**Contents**
+ [Limitaciones](#Appendix.SQLServer.Options.MSDTC.Limitations)
+ [Habilitación de MSDTC](Appendix.SQLServer.Options.MSDTC.Enabling.md)
  + [Creación del grupo de opciones para MSDTC](Appendix.SQLServer.Options.MSDTC.Enabling.md#Appendix.SQLServer.Options.MSDTC.OptionGroup)
  + [Agregar la opción de MSDTC al grupo de opciones](Appendix.SQLServer.Options.MSDTC.Enabling.md#Appendix.SQLServer.Options.MSDTC.Add)
  + [Creación del grupo de parámetros para MSDTC](Appendix.SQLServer.Options.MSDTC.Enabling.md#MSDTC.CreateParamGroup)
  + [Modificación del parámetro para MSDTC](Appendix.SQLServer.Options.MSDTC.Enabling.md#ModifyParam.MSDTC)
  + [Asociación del grupo de opciones y el grupo de parámetros con la instancia de base de datos](Appendix.SQLServer.Options.MSDTC.Enabling.md#MSDTC.Apply)
  + [Modificación de la opción MSDTC](Appendix.SQLServer.Options.MSDTC.Enabling.md#Appendix.SQLServer.Options.MSDTC.Modify)
+ [Utilización de transacciones](#Appendix.SQLServer.Options.MSDTC.Using)
  + [Uso de transacciones distribuidas](#Appendix.SQLServer.Options.MSDTC.UsingXA)
  + [Utilización de transacciones XA](#MSDTC.XA)
  + [Uso del seguimiento de transacciones](#MSDTC.Tracing)
+ [Deshabilitación de MSDTC](Appendix.SQLServer.Options.MSDTC.Disable.md)
+ [Solución de problemas de MSDTC para SQL Server de RDS](Appendix.SQLServer.Options.MSDTC.Troubleshooting.md)

## Limitaciones
<a name="Appendix.SQLServer.Options.MSDTC.Limitations"></a>

Las siguientes limitaciones se aplican al uso de MSDTC en RDS para SQL Server:
+ MSDTC no se admite en instancias que utilizan la creación de reflejo de base de datos de SQL Server. Para obtener más información, consulte [Transacciones - Grupos de disponibilidad y creación de reflejo de la base de datos](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).
+ El parámetro `in-doubt xact resolution` debe estar establecido en 1 o 2. Para obtener más información, consulte [Modificación del parámetro para MSDTC](Appendix.SQLServer.Options.MSDTC.Enabling.md#ModifyParam.MSDTC).
+ MSDTC requiere que todos los nombres de host que participan en transacciones distribuidas se puedan resolver mediante sus nombres de host. RDS mantiene automáticamente esta funcionalidad para instancias unidas a dominios. Sin embargo, para instancias independientes, asegúrese de configurar manualmente el servidor DNS.
+ Las transacciones XA de Java Database Connectivity (JDBC) son compatibles con SQL Server 2017 versión 14.00.3223.3 y posteriores, así como con SQL Server 2019.
+ No se admiten transacciones distribuidas que dependan de bibliotecas de vínculos dinámicos (DLL) del cliente en instancias de RDS.
+ No se admite el uso de bibliotecas de vínculos dinámicos XA personalizadas.

## Utilización de transacciones
<a name="Appendix.SQLServer.Options.MSDTC.Using"></a>

### Uso de transacciones distribuidas
<a name="Appendix.SQLServer.Options.MSDTC.UsingXA"></a>

En Amazon RDS for SQL Server, ejecute transacciones distribuidas de la misma manera que las transacciones distribuidas que se ejecutan en las instalaciones:
+ Usando transacciones promocionables `System.Transactions` de .NET Framework , que optimizan las transacciones distribuidas aplazando su creación hasta que sean necesarias.

  En este caso, la promoción es automática y no requiere ninguna intervención. Si solo hay un administrador de recursos dentro de la transacción, no se realiza ninguna promoción. Para obtener más información acerca de los ámbitos de transacción implícitos, consulte [Implementación de una transacción implícita usando el ámbito de transacción](https://docs.microsoft.com/en-us/dotnet/framework/data/transactions/implementing-an-implicit-transaction-using-transaction-scope) en la documentación de Microsoft.

  Las transacciones promocionables son compatibles con estas implementaciones .NET:
  + A partir de ADO.NET 2.0, `System.Data.SqlClient` admite transacciones promocionables con SQL Server. Para obtener más información, consulte [Integración de System.Transactions con SQL Server](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/system-transactions-integration-with-sql-server) en la documentación de Microsoft.
  + ODP.NET admite `System.Transactions`. Se crea una transacción local para la primera conexión abierta en el ámbito `TransactionsScope` a Oracle Database 11g versión 1 (versión 11.1) y posteriores. Cuando se abre una segunda conexión, esta transacción se promueve automáticamente a una transacción distribuida. Para obtener más información acerca de la compatibilidad con transacciones distribuidas en ODP.NET, consulte [Integración con Coordinador de transacciones distribuidas de Microsoft](https://docs.oracle.com/en/database/oracle/oracle-data-access-components/18.3/ntmts/using-mts-with-oracledb.html) en la documentación de Microsoft.
+ Uso de la instrucción `BEGIN DISTRIBUTED TRANSACTION`. Para obtener más información, consulte [BEGIN DISTRIBUTION TRANSACT-SQL (Transact-SQL)](https://docs.microsoft.com/en-us/sql/t-sql/language-elements/begin-distributed-transaction-transact-sql) en la documentación de Microsoft.

### Utilización de transacciones XA
<a name="MSDTC.XA"></a>

A partir de RDS for SQL Server 2017 versión 14.00.3223.3, puede controlar las transacciones distribuidas mediante JDBC. Cuando establece la opción `Enable XA` en `true` en la opción `MSDTC`, RDS habilita automáticamente las transacciones de JDBC y otorga el rol `SqlJDBCXAUser` al usuario `guest`. Esto permite ejecutar transacciones distribuidas mediante JDBC. Para obtener más información, incluido un ejemplo de código, consulte [Descripción de las transacciones XA](https://docs.microsoft.com/en-us/sql/connect/jdbc/understanding-xa-transactions) en la documentación de Microsoft.

### Uso del seguimiento de transacciones
<a name="MSDTC.Tracing"></a>

RDS admite controlar los seguimientos de transacciones de MSDTC y descargarlos desde la instancia de base de datos de RDS para solucionar problemas. Puede controlar las sesiones de seguimiento de transacciones ejecutando el siguiente procedimiento almacenado de RDS.

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

El siguiente parámetro es obligatorio:
+ `trace_action`: la acción de rastreo. Puede ser `START`, `STOP`, o `STATUS`.

Los siguientes parámetros son opcionales:
+ `@traceall`: establezca en 1 para realizar un seguimiento de todas las transacciones distribuidas. El valor predeterminado es 0.
+ `@traceaborted`: establezca en 1 para realizar un seguimiento de las transacciones distribuidas canceladas. El valor predeterminado es 0.
+ `@tracelong`: establezca en 1 para realizar un seguimiento de transacciones distribuidas de larga duración. El valor predeterminado es 0.

**Example de acción de seguimiento START**  
Para iniciar una nueva sesión de seguimiento de transacciones, ejecute la instrucción de ejemplo siguiente.  

```
exec msdb.dbo.rds_msdtc_transaction_tracing 'START',
@traceall='0',
@traceaborted='1',
@tracelong='1';
```
Solo puede estar activa una sesión de seguimiento de transacciones a la vez. Si se emite un nuevo comando `START` de sesión de seguimiento mientras una sesión de seguimiento está activa, se devuelve un error y la sesión de seguimiento activa se mantiene sin cambios.

**Example de acción de seguimiento STOP**  
Para detener una sesión de seguimiento de transacciones, ejecute la siguiente instrucción.  

```
exec msdb.dbo.rds_msdtc_transaction_tracing 'STOP'
```
Esta instrucción detiene la sesión de seguimiento de transacciones activa y guarda los datos de seguimiento de la transacción en el directorio de registro de la instancia de base de datos de RDS. La primera fila de la salida contiene el resultado general y las siguientes líneas indican los detalles de la operación.  
A continuación se muestra un ejemplo de una detención satisfactoria de sesión de seguimiento.  

```
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
```
Puede utilizar la información detallada para consultar el nombre del archivo de registro generado. Para obtener más información acerca de la descarga de archivos de registro de la instancia de base de datos de RDS, consulte [Supervisión de archivos de registro de Amazon RDS](USER_LogAccess.md).  
Los registros de sesión de seguimiento permanecen en la instancia durante 35 días. Los registros de sesión de seguimiento anteriores se eliminan automáticamente.

**Example de acción de seguimiento de STATUS**  
Para rastrear el estado de una sesión de seguimiento de transacciones, ejecute la siguiente instrucción.  

```
exec msdb.dbo.rds_msdtc_transaction_tracing 'STATUS'
```
Esta instrucción genera lo siguiente como filas separadas del conjunto de resultados.  

```
OK
SessionStatus: <Started|Stopped>
TraceAll: <True|False>
TraceAborted: <True|False>
TraceLongLived: <True|False>
```
La primera línea indica el resultado general de la operación: `OK` o `ERROR` con detalles, si procede. Las líneas siguientes indican detalles sobre el estado de la sesión de seguimiento:   
+ `SessionStatus` puede ser uno de los siguientes:
  + `Started` si se está ejecutando una sesión de seguimiento.
  + `Stopped` si no se está ejecutando ninguna sesión de seguimiento.
+ Los indicadores de sesión de seguimiento pueden ser `True` o `False` en función de cómo se establecieron en el `START` comando.