Симптоми
Да предположим, че създавате група за достъпност с помощта на клаузата WITH DTC_SUPPORT = PER_DB в Microsoft SQL Server. Когато се опитате да изпълните команда SAVE TRANSACTION в транзакция или система съхранени процедури като sp_executesql, получавате едно от следните съобщения за грешка:
Msg 627, ниво 16, състояние 0, lineNumber
Не може да се използва SAVE TRANSACTION в рамките на разпределена транзакция.
Msg 12324, ниво 16, състояние 100, lineNumber
Разпределени транзакции (DTC) не се поддържат с оптимизирани в паметта таблици.
Грешка: 3933, тежест: 16 състояние: 1.
Транзакцията не може да се повиши в разпределена транзакция, защото има активна точка на записване в тази транзакция.
Причина
Когато дадена база данни в групата за наличност "Винаги включена" е разрешена за С DTC_SUPPORT = PER_DB, докато една транзакция включва множество бази данни, транзакцията се повишава до транзакция на MSDTC в SQL Server 2016 SP2 и SQL Server 2017 г. Има ограничения в транзакциите на MSDTC, например не могат да се използват точки за записване, оптимизирани за паметта таблици не могат да се използват.
В някои случаи кръстосаните транзакции на бази данни не се случват, защото потребителите имат транзакции, включващи две потребителски бази данни, а защото транзакциите включват текущата база данни и системните бази данни (главна, tempdb, модел, база данни за системни ресурси). Тъй като базата данни за системни ресурси всъщност е само за четене, не е необходимо да се повишава до транзакция в MSDTC, ако кръстосаната транзакция с база данни включва системна ресурсна база данни, но не и други системни бази данни.
Решение
Корекцията, въведена в тази KB, пропуска повишението на MSDTC транзакция, ако системната база данни за ресурси и потребителска база данни, която е част от група за достъпност, разрешена за PER_DB DTC, са включени в транзакция между бази данни в рамките на една и съща SQL Server екземпляр.
Следователно, ако първоначалната причина за грешките, изброени по-горе, е кръстосана транзакция в базата данни, включваща база данни със системни ресурси, тази корекция ще я адресира. Понякога потребителят може да види грешките, изброени по-горе, със същата основна причина. По-долу са изброени условията, при които се прилага тази корекция:
-
Базата данни е част от група за наличност винаги включена, разрешена с DTC_SUPPORT = PER_DB.
-
Кръстосаната транзакция в база данни включва тази база данни и базата данни със системни ресурси в един и същ екземпляр на SQL Server.
-
Вътре в транзакцията между базите данни се използва SAVE TRANSACTION или са включени оптимизирани за паметта таблици.
Тази транзакция ще бъде неуспешна с грешките, изброени по-горе без тази корекция. С тази корекция такава транзакция трябва да продължи.
Забележка: Тази корекция адресира транзакции между бази данни, които включват базата данни със системни ресурси, но всяка транзакция между бази данни, която включва потребителски бази данни и съдържа команда SAVE TRANSACTION , все още ще бъде неуспешна и трябва да бъде пренаписана.
Този проблем е коригиран в следната кумулативна актуализация за SQL Server:
Всяка нова кумулативна актуализация за SQL Server съдържа всички горещи поправки и всички корекции на защитата, които са били включени в предишната кумулативна актуализация. Прегледайте най-новите кумулативни актуализации за SQL Server:
Повече информация
Допълнителна информация за DTC_SUPPORT = PER_DB, оптимизирани за паметта таблици, SAVE TRANSACTION може да бъде намерена в следващите връзки.
Транзакциите на бази данни в рамките на един и същ екземпляр на SQL Server свързват тази част с 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 Таблици,
оптимизирани за паметта, свързват тази част към
https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/transactions-with-memory-optimized-tables?view=sql-server-2017#limitationsSAVE TRANSACTION свържете тази част към https://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks
Статут
Microsoft потвърди, че това е проблем в продуктите на Microsoft, които са изброени в раздела "Отнася се за".
Препратки
Научете повече за терминологията , която Microsoft използва за описване на актуализациите на софтуера.