Sintomas

Suponha que cria um Grupo de Disponibilidade ao utilizar a cláusula WITH DTC_SUPPORT = PER_DB no Microsoft SQL Server. Quando tenta executar uma inspeção SAVE TRANSACTION numa transação ou procedimentos armazenados do sistema, como sp_executesql, recebe uma das seguintes mensagens de erro:

Msg 627, Nível 16, Estado 0, Número Linha
Não é possível utilizar SAVE TRANSACTION numa transação distribuída.
Msg 12324, Nível 16, Estado 100, Número Linha
As transações distribuídas (DTC) não são suportadas com tabelas otimizadas para memória.
Erro: 3933, Severidade: 16, Estado: 1.
Não é possível promover a transação a uma transação distribuída porque existe um ponto de guardar ativo nesta transação.

Causa

Quando uma base de dados no Grupo De Disponibilidade Always On está ativada para WITH DTC_SUPPORT = PER_DB, desde que uma transação envolva múltiplas bases de dados, a transação é promovida para 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 guardar, as tabelas otimizadas para memória não podem ser utilizadas.

Em algumas situações, as transações cruzadas de bases de dados não acontecem 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 (principal, tempdb, modelo, base de dados de recursos do sistema). Uma vez que a base de dados de recursos do sistema é na realidade 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 de sistema. 

Resolução

A correção introduzida neste KB ignora a promoção para transação MSDTC se a base de dados de recursos do sistema e uma base de dados de utilizadores que faz parte de um Grupo de Disponibilidade ativado para o PER_DB DTC estiverem envolvidos numa transação entre bases de dados na mesma instância do SQL Server.

Portanto, se a causa original dos erros listados acima for transação entre bases de dados que envolvem bases de dados de recursos do sistema, esta correção irá resolver o problema. Por vezes, o utilizador poderá ver os erros listados acima com a mesma causa subdata. A seguinte lista as condições às quais esta correção se aplica:

  • Uma base de dados faz parte de um Grupo de Disponibilidade Always On ativado WITH 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 SQL Server base de dados.

  • Na transação entre bases de dados, é utilizada a função GUARDAR TRANSAÇÃO ou são utilizadas tabelas otimizadas para a memória.

Esta transação falhava com erros listados acima sem esta correção. Com esta correção, essa transação deverá continuar.

Nota: esta correção corrigi endereços com 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 utilizadores e que contenha uma inspeção SAVE TRANSACTION continuará a falhar e terá de ser reescrita.

Este problema foi corrigido na seguinte atualização cumulativa para SQL Server:

Cada nova atualização cumulativa para o SQL Server contém todas as correções de segurança incluídas na atualização cumulativa anterior. Consulte as atualizações cumulativas mais recentes para SQL Server:

Mais Informações

Pode encontrar informações adicionais DTC_SUPPORT = PER_DB, tabelas otimizadas para a memória e GUARDAR TRANSAÇÃO nas seguintes ligações.

As transações de bases de dados na mesma instância SQL Server ligar esta parte à https://docs.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 Otimizadas de Memória ligam esta parte a
https://docs.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/transactions-with-memory-optimized-tables?view=sql-server-2017#limitationsSAVE TRANSACTION ligue esta parte à https://docs.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks

https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/configure-replication-for-always-on-availability-groups-sql-server?view=sql-server-2017#step2

Estado

A Microsoft confirmou que este problema ocorre nos produtos da 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.

Precisa de mais ajuda?

Aumente os seus conhecimentos
Explore as formações
Seja o primeiro a obter novas funcionalidades
Aderir ao Microsoft insiders

As informações foram úteis?

Quão satisfeito está com a qualidade do idioma?
O que afetou a sua experiência?

Obrigado pelo seu feedback!

×