Проблемы

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

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

Причина

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

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

Решение

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

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

  • База данных входит в группу доступности Always On с включенной DTC_SUPPORT = PER_DB.

  • Межбаза данных транзакции состоит из этой базы данных и базы данных системных ресурсов в том же экземпляре SQL Server.

  • В межбазовой транзакции базы данных используется сохранение транзакции, либо оптимизированные таблицы в памяти.

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

Примечание. это исправление предназначено для адресации межбазовой транзакции, включающей базу данных системных ресурсов, но при этом любая межбазовая транзакция, включающая пользовательские базы данных и содержащая ИНСТРУКЦИю сохранить транзакцию , будет завершаться сбоем и должна быть переписано.

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

Накопительное обновление 7 для SQL Server 2017       

Накопительное обновление 1 для SQL Server 2016 с пакетом обновления 2 (SP2)

Все новые накопительные обновления для SQL Server содержат все исправления и все исправления для системы безопасности, которые были включены в предыдущий накопительный пакет обновления. Ознакомьтесь с самыми последними накопительными обновлениями для SQL Server.

Последнее накопительное обновление для SQL Server 2017

Последнее накопительное обновление для SQL Server 2016

Дополнительная информация

Дополнительные сведения об DTC_SUPPORT = PER_DB, таблицах , оптимизированных в памяти, можно найти по следующим ссылкам.

Транзакции базы данных в той же ссылке на экземпляр SQL Server. Эта часть в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таблицах, оптимизированных для памяти . ссылка на эту часть в https://docs.Microsoft.com/en-US/SQL/Relational-databases/in-Memory-OLTP/Transactions-with-Memory-Optimized-Tables?View=SQL-Server-2017#limitationsсохранить транзакцию . Эта часть в 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

Статус

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

Ссылки

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

Нужна дополнительная помощь?

Совершенствование навыков
Перейти к обучению
Первоочередный доступ к новым возможностям
Присоединение к программе предварительной оценки Майкрософт

Были ли сведения полезными?

Насколько вы удовлетворены качеством перевода?
Что повлияло на вашу оценку?

Спасибо за ваш отзыв!

×