Symptomen
Stel dat u een beschikbaarheidsgroep maakt met behulp van de component WITH DTC_SUPPORT = PER_DB in Microsoft SQL Server. Wanneer u probeert een instructie SAVE TRANSACTION uit te voeren in een transactie of in het systeem opgeslagen procedures zoals sp_executesql, wordt een van de volgende foutberichten weergegeven:
Opmerking
Msg 627, Level 16, State 0, Line LineNumber
Kan SAVE TRANSACTION niet gebruiken in een gedistribueerde transactie.
Msg 12324, Level 16, State 100, Line LineNumber
Gedistribueerde transacties (DTC) worden niet ondersteund in combinatie met tabellen die zijn geoptimaliseerd voor geheugen.
Fout: 3933, ernst: 16, toestand: 1.
Kan de transactie niet promoveren naar een gedistribueerde transactie, omdat er een actief opslagpunt in deze transactie is.
Oorzaak
Wanneer een database in de groep AlwaysOn Availability is ingeschakeld voor MET DTC_SUPPORT = PER_DB, zolang een transactie betrekking heeft op meerdere databases, wordt de transactie gepromoveerd naar MSDTC-transactie in SQL Server 2016 SP2 en SQL Server 2017. Er zijn beperkingen in MSDTC-transacties, zo kunnen bijvoorbeeld geen opslagpunten worden gebruikt of kunnen tabellen die zijn geoptimaliseerd voor geheugen niet worden gebruikt.
In sommige situaties gebeuren transacties tussen databases niet omdat gebruikers transacties uitvoeren met betrekking tot twee gebruikersdatabases, maar omdat de transacties betrekking hebben op de huidige database en systeemdatabases (master, tempdb, model, systeemresourcedatabase). Omdat een systeembrondatabase eigenlijk alleen-lezen is, is het niet nodig om te promoveren naar MSDTC-transactie als een transactie tussen databases betrekking heeft op een systeembrondatabase, maar niet op andere systeemdatabases.
Oplossing
De oplossing die in deze KB is geïntroduceerd, slaat de promotie naar MSDTC-transactie over als een systeembrondatabase en een gebruikersdatabase die deel uitmaakt van een beschikbaarheidsgroep die is ingeschakeld voor PER_DB DTC betrokken zijn bij een transactie tussen databases binnen hetzelfde SQL Server exemplaar.
Als de oorspronkelijke oorzaak van de fouten hierboven genoemde fouten transacties tussen databases is waarbij een systeembrondatabase betrokken is, wordt dit met deze oplossing opgelost. Soms kan de gebruiker de hierboven vermelde fouten zien met dezelfde onderliggende oorzaak. Hieronder vindt u een overzicht van de omstandigheden waaronder deze oplossing van toepassing is:
- Een database maakt deel uit van een Always On Availability Group die is ingeschakeld MET DTC_SUPPORT = PER_DB.
- Bij een transactie tussen databases zijn deze database en de systeembrondatabase in dezelfde instantie van SQL Server betrokken.
- Binnen de transactie tussen databases wordt SAVE TRANSACTION gebruikt of zijn tabellen betrokken die zijn geoptimaliseerd voor geheugen.
Zonder deze oplossing zou een dergelijke transactie mislukken met de hierboven genoemde fouten. Met deze oplossing zou een dergelijke transactie moeten doorgaan.
Opmerking: deze oplossing heeft betrekking op transacties tussen databases waarbij de systeembrondatabase betrokken is, maar elke transactie tussen databases waarbij gebruikersdatabases betrokken zijn en een SAVE TRANSACTION-instructie bevat, mislukt nog steeds en moet worden herschreven.
Dit probleem is opgelost in de volgende cumulatieve update voor SQL Server:
Over cumulatieve updates voor SQL Server:
Elke nieuwe cumulatieve update voor SQL Server bevat alle hotfixes en alle beveiligingspatches die deel uitmaakten van de vorige cumulatieve update. Bekijk de meest recente cumulatieve updates voor SQL Server:
- Meest recente cumulatieve update voor SQL Server 2017
- Meest recente cumulatieve update voor SQL Server 2016
Meer informatie
Meer informatie over DTC_SUPPORT = PER_DB, voor geheugen geoptimaliseerde tabellen, SAVE TRANSACTION vindt u via de volgende koppelingen.
Databasetransacties binnen hetzelfde SQL Server exemplaar koppelen dit deel aan 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
Geheugengeoptimaliseerde tabellen koppelen dit gedeelte aan https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/transactions-with-memory-optimized-tables?view=sql-server-2017#limitations
TRANSACTIE OPSLAAN dit deel koppelen aan https://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks
Status
Microsoft heeft bevestigd dat dit een probleem is bij de Microsoft-producten die worden vermeld in de sectie Van toepassing op.
Meer informatie
Meer informatie over de terminologie die Microsoft gebruikt om software-updates te beschrijven.