Partilhar via


Transações envolvendo todos os bancos de dados sem suporte para espelhamento de banco de dados ou Grupos de Disponibilidade AlwaysOn (SQL Server)

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

  • Para transações envolvendo todos os bancos de dados: cada banco de dados é confirmado de forma independente. Portanto, mesmo para bancos de dados em um único grupo de disponibilidade, um failover pode ocorrer depois que um banco de dados confirma uma transação, mas antes de o outro banco de dados confirmar. Para espelhamento de banco de dados, esse problema é composto porque, após um failover, o banco de dados espelhado normalmente está em uma instância de servidor diferente do outro banco de dados e, mesmo que ambos os bancos de dados sejam espelhados entre os mesmos dois parceiros, não há garantia de que ambos os bancos de dados farão failover ao mesmo tempo.

  • Para transações distribuídas: após um failover, o novo servidor principal/réplica primária não poderá se conectar ao coordenador de transações distribuídas no servidor principal/réplica primária anterior. 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 poderá ocorrer se o servidor original principal para o banco de dados A não enviar o log de transações entre bancos de dados para o servidor de 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 acontecer no uso de 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 DTC não resulta em uma instalação sem suporte do SQL Server. Se, no entanto, um banco de dados faz parte de uma sessão de espelhamento de banco de dados ou do Grupo de Disponibilidade, e DTC também é usado no banco de dados, os problemas de suporte são investigados pela Microsoft somente se não relacionadas ao uso combinado de espelhamento de banco de dados ou grupos de disponibilidade com DTC.