現象
Microsoft SQL Server の WITH DTC_SUPPORT = PER_DB 句を使用して可用性グループを作成することを想定しています。 トランザクションまたはシステム ストアド プロシージャ (sp_executesqlなど) で SAVE TRANSACTION ステートメントを実行しようとすると、次のいずれかのエラー メッセージが表示されます。
Msg 627、レベル 16、状態 0、 Line LineNumber
分散トランザクション内で SAVE TRANSACTION を使用することはできません。
Msg 12324、レベル 16、状態 100、 Line LineNumber
分散トランザクション (DTC) は、メモリ最適化テーブルではサポートされていません。
エラー: 3933、重大度: 16、状態: 1。
このトランザクションにアクティブなセーブ ポイントがあるため、トランザクションを分散トランザクションに昇格できません。
原因
Always On可用性グループのデータベースが WITH DTC_SUPPORT = PER_DBに対して有効になっている場合、トランザクションに複数のデータベースが含まれている限り、トランザクションは 2016 SP2 および SQL Server 2017 SQL Server MSDTC トランザクションに昇格されます。 MSDTC トランザクションには制限があります。たとえば、セーブ ポイントを使用することはできません。メモリ最適化テーブルは使用できません。
場合によっては、ユーザーが 2 つのユーザー データベースを含むトランザクションを持っているのではなく、トランザクションに現在のデータベースとシステム データベース (マスター、tempdb、モデル、システム リソース データベース) が関係するため、データベース間トランザクションが発生することがあります。 システム リソース データベースは実際には読み取り専用であるため、クロス データベース トランザクションにシステム リソース データベースが含まれるが、他のシステム データベースが含まれていない場合は、MSDTC トランザクションに昇格する必要はありません。
解決方法
この KB で導入された修正プログラムは、システム リソース データベースと、PER_DB DTC が有効な可用性グループの一部であるユーザー データベースが同じSQL Server インスタンス内のクロス データベース トランザクションに関与している場合、MSDTC トランザクションへの昇格をスキップします。
したがって、上記のエラーの元の原因が、システム リソース データベースを含むクロス データベース トランザクションである場合は、この修正プログラムによって対処されます。 ユーザーが上記のエラーと同じ根本的な原因で表示される場合があります。 この修正プログラムが適用される条件を次に示します。
-
データベースは、DTC_SUPPORT = PER_DBで有効になっているAlways On可用性グループの一部です。
-
クロス データベース トランザクションには、同じ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
この部分をリンクします
SAVE TRANSACTION 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 にリンクする
状態
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。
参考資料
Microsoft がソフトウェア更新プログラムの説明に使用する 用語 について説明します。