Sintomas
Suponha que cria um Grupo de Disponibilidade com a cláusula WITH DTC_SUPPORT = PER_DB no Microsoft SQL Server. Quando tenta executar uma instrução GUARDAR TRANSAÇÃO numa transação ou procedimentos armazenados no sistema, como sp_executesql, recebe uma das seguintes mensagens de erro:
Nota
Msg 627, Nível 16, Estado 0, Número de Linha
Não é possível utilizar GUARDAR TRANSAÇÃO numa transação distribuída.
Msg 12324, Nível 16, Estado 100, Número de Linha
As transações distribuídas (DTC) não são suportadas com tabelas otimizadas para memória.
Erro: 3933, Gravidade: 16, Estado: 1.
Não é possível promover a transação para uma transação distribuída porque existe um ponto de poupança ativo nesta transação.
Causa
Quando uma base de dados no Grupo de Disponibilidade AlwaysOn está ativada para WITH DTC_SUPPORT = PER_DB, desde que uma transação envolva várias bases de dados, a transação é promovida para a transação MSDTC no SQL Server 2016 SP2 e SQL Server 2017. Existem limitações nas transações MSDTC, por exemplo, não é possível utilizar pontos de gravação, não é possível utilizar tabelas otimizadas para memória.
Em algumas situações, as transações entre bases de dados ocorrem não porque os utilizadores têm transações que envolvem duas bases de dados de utilizador, mas porque as transações envolvem a base de dados atual e as bases de dados do sistema (base de dados mestra, tempdb, modelo, base de dados de recursos do sistema). Uma vez que a base de dados de recursos do sistema é realmente só de leitura, não é necessário promover a transação MSDTC se uma transação entre bases de dados envolver a base de dados de recursos do sistema, mas não outras bases de dados do sistema.
Resolução
A correção introduzida neste KB ignora a promoção para a transação MSDTC se a base de dados de recursos do sistema e uma base de dados de utilizador que faz parte de um Grupo de Disponibilidade ativado para PER_DB DTC estiverem envolvidos numa transação entre bases de dados na mesma instância SQL Server.
Por conseguinte, se a causa original dos erros listados acima for a transação entre bases de dados que envolve a base de dados de recursos do sistema, esta correção irá resolvê-la. Por vezes, o utilizador pode ver os erros listados acima com a mesma causa subjacente. O seguinte lista as condições nas quais esta correção se aplica:
- Uma base de dados faz parte de um Grupo de Disponibilidade AlwaysOn ativado com DTC_SUPPORT = PER_DB.
- Uma transação entre bases de dados envolve esta base de dados e a base de dados de recursos do sistema na mesma instância SQL Server.
- Dentro da transação entre bases de dados, é utilizada a operação GUARDAR TRANSAÇÃO ou estão envolvidas tabelas otimizadas para memória.
Essa transação falharia com erros listados acima sem esta correção. Com esta correção, essa transação deve prosseguir.
Nota: esta correção corrige as transações entre bases de dados que envolvem a base de dados de recursos do sistema, mas qualquer transação entre bases de dados que envolva bases de dados de utilizador e contenha uma instrução SAVE TRANSACTION continuará a falhar e terá de ser reescrita.
Este problema foi corrigido na seguinte atualização cumulativa para SQL Server:
Acerca das atualizações cumulativas para SQL Server:
Cada nova atualização cumulativa para SQL Server contém todas as correções e todas as correções de segurança incluídas na atualização cumulativa anterior. Consulte as atualizações cumulativas mais recentes para SQL Server:
- Atualização cumulativa mais recente do SQL Server 2017
- Atualização cumulativa mais recente do SQL Server 2016
Mais Informações
Pode encontrar informações adicionais sobre DTC_SUPPORT = PER_DB, tabelas otimizadas para memória, GUARDAR TRANSAÇÃO nas seguintes ligações.
As transações de base de dados na mesma instância SQL Server ligam esta parte a 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
As Tabelas Otimizadas para Memória ligam esta parte a https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/transactions-with-memory-optimized-tables?view=sql-server-2017#limitations
GUARDAR TRANSAÇÃO liga esta parte ao https://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks
Estado
A Microsoft confirmou que se trata de um problema nos produtos Microsoft listados na secção "Aplica-se a".
Referências
Saiba mais sobre a terminologia que a Microsoft utiliza para descrever as atualizações de software.