Suporte para o Microsoft Distributed Transaction Coordinator no RDS for SQL Server
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
Sumário
Limitações
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
. -
O parâmetro
in-doubt xact resolution
deve ser definido como 1 ou 2. Para ter mais informações, consulte Modificar o parâmetro para o 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
Usar transações distribuídas
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
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 Serverna documentação da Microsoft. -
O ODP.NET oferece suporte a
System.Transactions
. Uma transação local é criada para a primeira conexão aberta no escopoTransactionsScope
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 integrationna documentação da Microsoft.
-
-
Usando a instrução
BEGIN DISTRIBUTED TRANSACTION
. Para obter mais informações, consulte BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)na documentação da Microsoft.
Como usar transações XA
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
Usar rastreamento de transações
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
ouSTATUS
.
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.
exemplo 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
';
nota
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.
exemplo 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.
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.
exemplo 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
ouFalse
dependendo de como foram definidos no comandoSTART
.