SymptĂ´mes
Supposons que vous créez un groupe de disponibilité à l’aide de la clause WITH DTC_SUPPORT = PER_DB dans Microsoft SQL Server. Lorsque vous essayez d’exécuter une instruction SAVE TRANSACTION dans une transaction ou des procédures stockées système telles que sp_executesql, vous recevez l’un des messages d’erreur suivants :
Msg 627, Niveau 16, État 0, LineNumber
Impossible d’utiliser SAVE TRANSACTION dans une transaction distribuée.
Msg 12324, Niveau 16, État 100, LineNumber
Les transactions distribuées (DTC) ne sont pas prises en charge avec les tables mémoire optimisées.
Erreur : 3933, Gravité : 16, État : 1.
Impossible de promouvoir la transaction vers une transaction distribuée, car cette transaction comporte un point d’enregistrement actif.
Cause
Lorsqu’une base de données dans Always On groupe de disponibilité est activée pour WITH DTC_SUPPORT = PER_DB, tant qu’une transaction implique plusieurs bases de données, la transaction est promue en transaction MSDTC dans SQL Server 2016 SP2 et SQL Server 2017. Il existe des limitations dans les transactions MSDTC. Par exemple, les points d’enregistrement ne peuvent pas être utilisés, les tables optimisées en mémoire ne peuvent pas être utilisées.
Dans certains cas, les transactions entre bases de donnĂ©es se produisent non pas parce que les utilisateurs ont des transactions impliquant deux bases de donnĂ©es utilisateur, mais parce que les transactions impliquent la base de donnĂ©es actuelle et les bases de donnĂ©es système (master, tempdb, modèle, base de donnĂ©es de ressources système). Étant donnĂ© que la base de donnĂ©es de ressources système est en fait en lecture seule, il n’est pas nĂ©cessaire de promouvoir une transaction MSDTC si une transaction entre bases de donnĂ©es implique une base de donnĂ©es de ressources système, mais pas d’autres bases de donnĂ©es système.Â
RĂ©solution
Le correctif introduit dans cette base de connaissances ignore la promotion vers la transaction MSDTC si la base de données de ressources système et une base de données utilisateur qui fait partie d’un groupe de disponibilité activé pour PER_DB DTC sont impliqués dans une transaction entre bases de données au sein de la même instance SQL Server.
Par conséquent, si la cause d’origine des erreurs répertoriées ci-dessus est une transaction entre bases de données impliquant une base de données de ressources système, ce correctif y remédiera. Parfois, l’utilisateur peut voir les erreurs répertoriées ci-dessus avec la même cause sous-jacente. La liste suivante répertorie les conditions dans lesquelles ce correctif s’applique :
-
Une base de données fait partie d’un groupe de disponibilité Always On activé with DTC_SUPPORT = PER_DB.
-
Une transaction entre bases de données implique cette base de données et la base de données de ressources système dans la même instance SQL Server.
-
À l’intérieur de la transaction entre bases de données, SAVE TRANSACTION est utilisé ou des tables mémoire optimisées sont impliquées.
Une telle transaction échouerait avec des erreurs répertoriées ci-dessus sans ce correctif. Avec ce correctif, cette transaction doit continuer.
Remarque : ce correctif résout les transactions entre bases de données qui impliquent la base de données de ressources système, mais toute transaction entre bases de données impliquant des bases de données utilisateur et contenant une instruction SAVE TRANSACTION échoue et doit être réécrite.
Ce problème est résolu dans la mise à jour cumulative suivante pour SQL Server :
Chaque nouvelle mise à jour cumulative pour SQL Server contient tous les correctifs logiciels et tous les correctifs de sécurité inclus dans la mise à jour cumulative précédente. Découvrez les dernières mises à jour cumulatives pour SQL Server :
Informations supplémentaires
Des informations supplémentaires sur DTC_SUPPORT = PER_DB, les tables mémoire optimisées, SAVE TRANSACTION sont disponibles dans les liens suivants.
Les transactions de base de données au sein de la même instance SQL Server lient cette partie à 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
tables mĂ©moire optimisĂ©es lient cette partie Ă
https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/transactions-with-memory-optimized-tables?view=sql-server-2017#limitationsSAVE TRANSACTION liez cette partie Ă https://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks
État
Microsoft a confirmé l'existence de ce problème dans les produits Microsoft figurant dans la liste des produits concernés par cet article.
Références
Découvrez la terminologie utilisée par Microsoft pour décrire les mises à jour logicielles.