

# Suporte para o Microsoft Distributed Transaction Coordinator no RDS for SQL Server
<a name="Appendix.SQLServer.Options.MSDTC"></a>

Uma *transação distribuída* é uma transação de banco de dados na qual dois ou mais hosts de rede estão envolvidos. O Amazon RDS for SQL Server oferece suporte a transações distribuídas entre hosts. Um host único pode ser o seguinte:
+ Instância de banco de dados do RDS for SQL Server
+ Host do SQL Server no local
+ O host do Amazon EC2 com o SQL Server instalado
+ Qualquer outro host do EC2 ou instância de banco de dados do RDS com um mecanismo de banco de dados que ofereça suporte a transações distribuídas

No RDS, a começar pelo SQL Server 2012 (versão 11.00.5058.0.v1 e posterior), todas as edições do RDS for SQL Server oferecem suporte a transações distribuídas. O suporte é fornecido usando o MSDTC (Microsoft Distributed Transaction Coordinator). Para obter informações detalhadas sobre o MSDTC, consulte [Distributed Transaction Coordinator](https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms684146(v=vs.85)) na documentação da Microsoft.

**Contents**
+ [Limitações](#Appendix.SQLServer.Options.MSDTC.Limitations)
+ [Habilitar o MSDTC](Appendix.SQLServer.Options.MSDTC.Enabling.md)
  + [Criar o grupo de opções para o MSDTC](Appendix.SQLServer.Options.MSDTC.Enabling.md#Appendix.SQLServer.Options.MSDTC.OptionGroup)
  + [Adicionar a opção do MSDTC ao grupo de opções](Appendix.SQLServer.Options.MSDTC.Enabling.md#Appendix.SQLServer.Options.MSDTC.Add)
  + [Criar o grupo de parâmetros para o MSDTC](Appendix.SQLServer.Options.MSDTC.Enabling.md#MSDTC.CreateParamGroup)
  + [Modificar o parâmetro para o MSDTC](Appendix.SQLServer.Options.MSDTC.Enabling.md#ModifyParam.MSDTC)
  + [Associar o grupo de opções e o grupo de parâmetros à instância de banco de dados.](Appendix.SQLServer.Options.MSDTC.Enabling.md#MSDTC.Apply)
  + [Modificar a opção do MSDTC](Appendix.SQLServer.Options.MSDTC.Enabling.md#Appendix.SQLServer.Options.MSDTC.Modify)
+ [Usar transações](#Appendix.SQLServer.Options.MSDTC.Using)
  + [Usar transações distribuídas](#Appendix.SQLServer.Options.MSDTC.UsingXA)
  + [Como usar transações XA](#MSDTC.XA)
  + [Usar rastreamento de transações](#MSDTC.Tracing)
+ [Desabilitar o MSDTC](Appendix.SQLServer.Options.MSDTC.Disable.md)
+ [Solução de problemas do MSDTC para o RDS for SQL Server](Appendix.SQLServer.Options.MSDTC.Troubleshooting.md)

## Limitações
<a name="Appendix.SQLServer.Options.MSDTC.Limitations"></a>

As seguintes limitações se aplicam ao uso do MSDTC no RDS for SQL Server:
+ Não há suporte para o MSDTC em instâncias que usam o SQL Server Database Mirroring. Para obter mais informações, consulte [Transações – grupos de disponibilidade e espelhamento de banco de dados](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).
+ O parâmetro `in-doubt xact resolution` deve ser definido como 1 ou 2. Para obter mais informações, consulte [Modificar o parâmetro para o MSDTC](Appendix.SQLServer.Options.MSDTC.Enabling.md#ModifyParam.MSDTC).
+ O MSDTC requer que todos os hosts participantes em transações distribuídas sejam resolvidos usando os nomes de host. O RDS mantém automaticamente essa funcionalidade para instâncias associadas ao domínio. No entanto, para instâncias autônomas, configure o servidor DNS manualmente.
+ As transações XA do Java Database Connectivity (JDBC) são compatíveis com a versão 14.00.3223.3 e superior do SQL Server 2017 e o SQL Server 2019.
+ Não há suporte para transações distribuídas que dependem de bibliotecas de links dinâmicos (DLLs) do cliente em instâncias do RDS.
+ Não há suporte para o uso de bibliotecas de links dinâmicos XA personalizadas.

## Usar transações
<a name="Appendix.SQLServer.Options.MSDTC.Using"></a>

### Usar transações distribuídas
<a name="Appendix.SQLServer.Options.MSDTC.UsingXA"></a>

No Amazon RDS for SQL Server, você executa transações distribuídas da mesma maneira que transações distribuídas em execução no local:
+ Usando transações promovíveis `System.Transactions` do .NET framework, que otimiza transações distribuídas ao adiar as criações até que sejam necessárias.

  Neste caso, a promoção é automática e não requer que você faça qualquer intervenção. Se houver apenas um gerenciador de recursos dentro da transação, nenhuma promoção será executada. Para obter mais informações sobre escopos de transação implícita, consulte [Implementing an implicit transaction using transaction scope](https://docs.microsoft.com/en-us/dotnet/framework/data/transactions/implementing-an-implicit-transaction-using-transaction-scope) na documentação da Microsoft.

  As transações promovíveis são compatíveis com estas implementações .NET: 
  + Começando com o ADO.NET 2.0, `System.Data.SqlClient` oferece suporte a transações promovíveis com o SQL Server. Para obter mais informações, consulte [System.Transactions integration with SQL Server](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/system-transactions-integration-with-sql-server) na documentação da Microsoft.
  + O ODP.NET oferece suporte a `System.Transactions`. Uma transação local é criada para a primeira conexão aberta no escopo `TransactionsScope` para o Oracle Database 11g release 1 (versão 11.1) e posterior. Quando uma segunda conexão é aberta, essa transação é automaticamente promovida para uma transação distribuída. Para obter mais informações sobre suporte de transações distribuídas no ODP.NET, consulte [Microsoft Distributed Transaction Coordinator integration](https://docs.oracle.com/en/database/oracle/oracle-data-access-components/18.3/ntmts/using-mts-with-oracledb.html) na documentação da Microsoft.
+ Usando a instrução `BEGIN DISTRIBUTED TRANSACTION`. Para obter mais informações, consulte [BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)](https://docs.microsoft.com/en-us/sql/t-sql/language-elements/begin-distributed-transaction-transact-sql) na documentação da Microsoft.

### Como usar transações XA
<a name="MSDTC.XA"></a>

A partir da versão 14.00.3223.3 do RDS para SQL Server 2017, você pode controlar transações distribuídas usando o JDBC. Quando você define a opção `Enable XA` para `true` na opção `MSDTC`, o RDS habilita automaticamente as transações do JDBC e concede a função `SqlJDBCXAUser` ao usuário `guest`. Isso permite a execução de transações distribuídas por meio do JDBC. Para obter mais informações, incluindo um exemplo de código, consulte [Noções básicas sobre transações XA](https://docs.microsoft.com/en-us/sql/connect/jdbc/understanding-xa-transactions) na documentação da Microsoft.

### Usar rastreamento de transações
<a name="MSDTC.Tracing"></a>

O RDS oferece suporte ao controle de rastreamentos de transação do MSDTC e ao download deles na instância de banco de dados do RDS para solução de problemas. É possível controlar sessões de rastreamento de transação executando o procedimento armazenado do RDS a seguir.

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

O parâmetro a seguir é obrigatório.
+ `trace_action` – A ação de rastreamento. Ela pode ser: `START`, `STOP` ou `STATUS`.

Os seguintes parâmetros são opcionais:
+ `@traceall` – Defina como 1 para rastrear todas as transações distribuídas. O padrão é 0.
+ `@traceaborted` – Defina como 1 para rastrear transações distribuídas canceladas. O padrão é 0.
+ `@tracelong` – Defina como 1 para rastrear transações distribuídas de execução longa. O padrão é 0.

**Example de ação de rastreamento START**  
Para iniciar uma nova sessão de rastreamento de transação, execute o exemplo de instrução a seguir.  

```
exec msdb.dbo.rds_msdtc_transaction_tracing 'START',
@traceall='{{0}}',
@traceaborted='{{1}}',
@tracelong='{{1}}';
```
Apenas uma sessão de rastreamento de transação pode estar ativa ao mesmo tempo. Se um novo comando de sessão de rastreamento `START` for emitido enquanto uma sessão de rastreamento estiver ativa, um erro será retornado e a sessão de rastreamento ativa permanecerá inalterada.

**Example de ação de rastreamento STOP**  
Para interromper uma sessão de rastreamento de transação, execute a instrução a seguir.  

```
exec msdb.dbo.rds_msdtc_transaction_tracing 'STOP'
```
Esta instrução interrompe a sessão de rastreamento de transação ativa e salva os dados de rastreamento de transação no diretório de log na instância de banco de dados do RDS. A primeira linha da saída contém o resultado geral e as linhas a seguir indicam os detalhes da operação.  
Veja a seguir um exemplo de uma interrupção de sessão de rastreamento bem-sucedida.  

```
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
```
É possível usar as informações detalhadas para consultar o nome do arquivo de log gerado. Para obter mais informações sobre como baixar arquivos de log na instância de banco de dados do RDS, consulte [Monitorar arquivos de log do Amazon RDS](USER_LogAccess.md).  
Os logs de sessão de rastreamento permanecem na instância por 35 dias. Todos os logs de sessão de rastreamento mais antigos são excluídos automaticamente.

**Example de ação de rastreamento STATUS**  
Para rastrear o status de uma sessão de rastreamento de transação, execute a instrução a seguir.  

```
exec msdb.dbo.rds_msdtc_transaction_tracing 'STATUS'
```
Esta instrução gera o seguinte como linhas separadas do conjunto de resultados.  

```
OK
SessionStatus: <{{Started|Stopped}}>
TraceAll: <{{True|False}}>
TraceAborted: <{{True|False}}>
TraceLongLived: <{{True|False}}>
```
A primeira linha indica o resultado geral da operação: `OK` ou `ERROR` com detalhes, se aplicável. As linhas subsequentes indicam detalhes sobre o status da sessão de rastreamento:   
+ `SessionStatus` pode ser um dos seguintes:
  + `Started` se uma sessão de rastreamento estiver sendo executada.
  + `Stopped` se nenhuma sessão de rastreamento estiver sendo executada.
+ Os sinalizadores de sessão de rastreamento podem ser `True` ou `False` dependendo de como foram definidos no comando `START`.