KB4092554 . ИСПРАВЛЕНИЕ. Ошибки 627 или 12324 возникают при повышении транзакций между базами данных до распределенных транзакций в группе доступности SQL Server

Применяется к
SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2017 Developer on Windows SQL Server 2017 Enterprise Core on Windows SQL Server 2017 Enterprise on Windows SQL Server 2017 Standard on Windows

Проблема

Предположим, что вы создали группу доступности с помощью предложения WITH DTC_SUPPORT = PER_DB в Microsoft SQL Server. При попытке выполнить инструкцию SAVE TRANSACTION в транзакции или системных хранимых процедурах, таких как sp_executesql, появляется одно из следующих сообщений об ошибке:

Примечание

Msg 627, Level 16, State 0, LineNumber
Не удается использовать SAVE TRANSACTION в распределенной транзакции.
Msg 12324, Level 16, State 100, LineNumber
Распределенные транзакции (DTC) не поддерживаются оптимизированными для памяти таблицами.
Ошибка: 3933, серьезность: 16, состояние: 1.
Невозможно повысить уровень транзакции до распределенной, так как в ней есть активная точка сохранения.

Причина

Если для базы данных в группе доступности Always On включен параметр WITH DTC_SUPPORT = PER_DB, если транзакция включает несколько баз данных, транзакция повышается до транзакции MSDTC в SQL Server 2016 с пакетом обновления 2 (SP2) и SQL Server 2017 г. Существуют ограничения в транзакциях MSDTC, например точки сохранения нельзя использовать, оптимизированные для памяти таблицы нельзя использовать.

В некоторых ситуациях транзакции между базами данных происходят не потому, что у пользователей есть транзакции с двумя пользовательскими базами данных, а потому, что транзакции включают текущую базу данных и системные базы данных (master, tempdb, model, база данных системных ресурсов). Так как база данных системных ресурсов фактически доступна только для чтения, не нужно повышать уровень до транзакции MSDTC, если транзакция между базами данных включает системную базу данных ресурсов, но не другие системные базы данных.

Решение

Исправление, представленное в этом кб, пропускает повышение до транзакции MSDTC, если системная база данных ресурсов и пользовательская база данных, в которую включена группа доступности, включенная для PER_DB DTC, участвуют в транзакции между базами данных в пределах одного SQL Server экземпляра.

Таким образом, если первоначальной причиной ошибок, перечисленных выше, является транзакция между базами данных с использованием системной базы данных ресурсов, это исправление будет устранено. Иногда пользователь может увидеть перечисленные выше ошибки с той же основной причиной. Ниже перечислены условия, при которых применяется это исправление.

  • База данных является частью группы доступности Always On с поддержкой WITH DTC_SUPPORT = PER_DB.
  • Транзакция между базами данных включает эту базу данных и базу данных системных ресурсов в одном экземпляре SQL Server.
  • Внутри транзакции между базами данных используется SAVE TRANSACTION или используются оптимизированные для памяти таблицы.

Без этого исправления такая транзакция завершится сбоем с ошибками, перечисленными выше. С помощью этого исправления такая транзакция должна продолжаться.

Примечание. Это исправление устраняет транзакции между базами данных, в которых задействована база данных системных ресурсов, но любая транзакция между базами данных, которая включает пользовательские базы данных и содержит инструкцию SAVE TRANSACTION , по-прежнему завершается ошибкой и должна быть перезаписана.

Эта проблема устранена в следующем накопительном обновлении для SQL Server:

Сведения о накопительных обновлениях для 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#limitations
СОХРАНИТЬ ТРАНЗАКЦИЮ , свяжите эту часть с https://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks

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

Состояние

Корпорация Майкрософт подтвердила, что это проблема продуктов Microsoft, перечисленных в разделе «Относится к».

Ссылки

Сведения о терминологии, используемой корпорацией Майкрософт для описания обновлений программного обеспечения.