Transações envolvendo todos os bancos de dados e espelhamento de banco de dados

Não há suporte para espelhamento de banco de dados com transações de banco de dados cruzado ou transações distribuídas. Isso é porque a atomicidade/integridade da transação não pode ser garantida pelos seguintes motivos:

  • Para transações de banco de dados cruzado: depois de um failover, o banco de dados espelhado está em uma instância de servidor diferente, geralmente em um banco de dados separado do banco de dados não espelhado. Mesmo que ambos os bancos de dados sejam espelhados entre os mesmos dois parceiros, não há nenhuma garantia de que ambos os bancos de dados terão failover ao mesmo tempo.

  • Para transações distribuídas: após um failover, o novo servidor principal não é capaz de se conectar ao coordenador de transações distribuídas do servidor principal anterior que usa a mesma ID de recurso. Portanto, o novo servidor principal não pode obter o status da transação.

O exemplo 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 espelhado, 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á estando 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 de banco de dados cruzado pode ser confirmada com sucesso no banco de dados B, mas não no banco de dados onde ocorreu failover. Isto pode ocorrer se o servidor original principal para o banco de dados A não enviar o log de transações de banco de dados cruzado 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 possui conhecimento do novo servidor principal e encerra qualquer transação que esteja "sendo preparada para confirmação”, considerada confirmada em outros bancos de dados.