Partilhar via


Transações entre bancos de dados não são suportadas no SQL Server para espelhamento de banco de dados ou Grupos de Disponibilidade AlwaysOn.

Transações entre bancos de dados e transações distribuídas não são compatíveis com Grupos de Disponibilidade AlwaysOn ou por espelhamento de banco de dados. Isso ocorre porque a atomicidade/integridade da transação não pode ser garantida pelos seguintes motivos:

  • Para transações entre bancos de dados: cada banco de dados comete de forma independente. Portanto, mesmo para bancos de dados em apenas um grupo de disponibilidade, um failover pode ocorrer após um banco de dados confirmar uma transação, mas antes que o outro banco de dados o faça. Para espelhamento de banco de dados, este problema se agrava porque, após um failover, o banco de dados espelhado geralmente está em uma instância de servidor diferente do outro banco de dados. Mesmo que ambos os bancos de dados sejam espelhados entre os mesmos dois servidores parceiros, não há garantia de que ambos os bancos de dados executarão o failover ao mesmo tempo.

  • Para transações distribuídas: após um failover, a nova réplica principal/servidor principal não consegue se conectar ao coordenador de transações distribuídas no servidor principal anterior/réplica primária. Portanto, o novo servidor principal/réplica primária não pode obter o status da transação.

O exemplo de espelhamento de banco de dados a seguir ilustra como uma inconsistência lógica pode ocorrer. Neste exemplo, um aplicativo usa uma transação de banco de dados cruzado para inserir duas linhas de dados: uma linha é inserida em uma tabela em um banco de dados espelho, A, e a outra linha é inserida em uma tabela em outro banco de dados, B. O banco de dados A está sendo espelhado em modo de alta segurança com failover automático. Enquanto a transação está sendo confirmada, o banco de dados A torna-se indisponível e ocorre failover automático na sessão de espelhamento para o espelho do banco de dados A.

Depois do failover, a transação entre bancos de dados pode ser confirmada com sucesso no banco de dados B, mas não no banco de dados onde ocorreu failover. Isso ocorreria se o servidor principal original do banco de dados A não tivesse enviado o log da transação entre bancos de dados para o servidor espelho antes da falha. Depois do failover, a transação não existirá no novo servidor principal. Os bancos de dados A e B se tornarão inconsistentes, porque os dados inseridos no banco de dados B permanecerão intactos, mas os dados inseridos no banco de dados A serão perdidos.

Um cenário semelhante pode ocorrer ao usar uma transação MS DTC. Por exemplo, depois do failover, o novo principal contata o MS DTC. Mas o MS DTC não tem conhecimento do novo servidor principal e encerra qualquer transação que esteja "sendo preparada para confirmação”, considerada confirmada em outros bancos de dados.

Importante

Usar o Espelhamento de Banco de Dados ou grupos de disponibilidade junto com o DTC não resulta em uma instalação sem suporte do SQL Server. Se, no entanto, um banco de dados fizer parte de uma sessão de Espelhamento de Banco de Dados ou um Grupo de Disponibilidade e DTC também for usado no banco de dados, os problemas de suporte serão investigados pela Microsoft somente se não estiverem relacionados ao uso combinado de Espelhamento de Banco de Dados ou Grupos de Disponibilidade com DTC.