Sintomas
Suponha que você crie um Grupo de Disponibilidade usando a cláusula WITH DTC_SUPPORT = PER_DB no Microsoft SQL Server. Ao tentar executar uma instrução SAVE TRANSACTION em uma transação ou procedimentos armazenados do sistema, como sp_executesql, você recebe uma das seguintes mensagens de erro:
Msg 627, Nível 16, Estado 0, Line LineNumber
Não é possível usar SAVE TRANSACTION em uma transação distribuída.
Msg 12324, Nível 16, Estado 100, Line LineNumber
Não há suporte para transações distribuídas (DTC) com tabelas com otimização de memória.
Erro: 3933, Gravidade: 16, Estado: 1.
Não é possível promover a transação para uma transação distribuída porque há um ponto de salvamento ativo nessa transação.
Causa
Quando um banco de dados no grupo de disponibilidade do Always On está habilitado para WITH DTC_SUPPORT = PER_DB, desde que uma transação envolva vários bancos de dados, a transação é promovida para a transação MSDTC no SQL Server 2016 SP2 e SQL Server 2017. Há limitações em transações MSDTC, por exemplo, pontos de salvamento não podem ser usados, tabelas com otimização de memória não podem ser usadas.
Em algumas situações, as transações entre bancos de dados ocorrem não porque os usuários têm transações que envolvem dois bancos de dados de usuário, mas porque as transações envolvem o banco de dados atual e os bancos de dados do sistema (mestre, tempdb, modelo, banco de dados de recursos do sistema). Como o banco de dados de recursos do sistema é realmente somente leitura, não é necessário promover a transação MSDTC se uma transação entre bancos de dados envolve o banco de dados de recursos do sistema, mas não outros bancos de dados do sistema.
Resolução
A correção introduzida nesta KB ignora a promoção para a transação MSDTC se o banco de dados de recursos do sistema e um banco de dados de usuário que faz parte de um Grupo de Disponibilidade habilitado para PER_DB DTC estão envolvidos em uma transação entre bancos de dados na mesma instância do SQL Server.
Portanto, se a causa original dos erros listados acima for uma transação entre bancos de dados envolvendo o banco de dados de recursos do sistema, essa correção resolverá isso. Às vezes, o usuário pode ver os erros listados acima com a mesma causa subjacente. O seguinte lista as condições sob as quais essa correção se aplica:
-
Um banco de dados faz parte de um grupo Always On disponibilidade habilitado with DTC_SUPPORT = PER_DB.
-
Uma transação entre bancos de dados envolve esse banco de dados e o banco de dados de recursos do sistema na mesma SQL Server instância.
-
Dentro da transação entre bancos de dados, SAVE TRANSACTION é usado ou tabelas com otimização de memória estão envolvidas.
Essa transação falharia com erros listados acima sem essa correção. Com essa correção, essa transação deve continuar.
Observação: essa correção aborda transações entre bancos de dados que envolvem o banco de dados de recursos do sistema, mas qualquer transação entre bancos de dados que envolva bancos de dados de usuário e contenha uma instrução SAVE TRANSACTION ainda falhará e deverá ser reescrita.
Esse problema foi corrigido na seguinte atualização cumulativa para SQL Server:
Cada nova atualização cumulativa para SQL Server contém todos os hotfixes e todas as correções de segurança que foram incluídas na atualização cumulativa anterior. Confira as atualizações cumulativas mais recentes para SQL Server:
Informações adicionais
Informações adicionais sobre DTC_SUPPORT = PER_DB, tabelas com otimização de memória, SAVE TRANSACTION podem ser encontradas nos links a seguir.
Transações de banco de dados na mesma instância SQL Server vinculam essa parte https://learn.microsoft.com/en-us/sql/database-engine/availability-groups/windows/transactions-always-on-availability-and-database-mirroring?view=sql-server-2017#sql-server-2016-sp1-and-before-support-for-cross-database-transactions-within-the-same-sql-server-instance
tabelas com otimizaçãode memória vinculam essa parte a
https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/transactions-with-memory-optimized-tables?view=sql-server-2017#limitationslink SALVAR TRANSAÇÃO esta parte para https://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks
Status
A Microsoft confirmou que este é um problema nos produtos Microsoft listados na seção "Aplicável a".
Referências
Saiba mais sobre a terminologia que a Microsoft usa para descrever as atualizações de software.