SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server 2017 の on Linux における分散トランザクションのサポート状況について

leave a comment

Linux 上の SQL Server 2017 のリリース ノート に次のような記載があります。

Distributed transactions requiring the Microsoft Distributed Transaction Coordinator service are not supported on SQL Server running on Linux. SQL Server to SQL Server linked servers are supported unless they involve the DTC. For more information, see Distributed transactions requiring the Microsoft Distributed Transaction Coordinator service are not supported on SQL Server running on Linux.

2017/12 末時点の SQL Server 2017 on Linux では、DTC がサポートされておらず、ローカルトランザクションによるトランザクションについては、サポートされていますが、DTC を使用したトランザクションについてはサポートされていません。
(ローカルトランザクションはサポートされているので、同一サーバー内の複数の DB に対してのトランザクションはサポートされています)
これについては、AlwaysOn 可用性グループの DTC サポート (DTC_SUPPORT = PER_DB) についても含まれているようで、Linux 版については、可用性グループの分散トランザクションサポート についても該当することになるかと思います。

可用性グループの対応については 2016 の情報となりますが、SQL Server 2016 DTC Support In Availability Groups を最初に見ておくといいと思います。
SQL Server 2016 で、MS DTC と連携されるようになり、可用性グループで保護しているデータベース単位で、リソースマネージャーとして登録されるよう、設定でがきるようになっています。
SQL Server on Linux で可用性グループを設定した場合、「DTC_SUPPORT = PER_DB」を設定することはできるのですが、設定を行っても次のようなエラーになっているかと

データベース ‘db1’ の Microsoft 分散トランザクション コーディネーター (MS DTC) リソース マネージャー [e8b57aad-fa92-4e94-a6ba-be71c1043f37] を初期化しています。これは通知専用メッセーです。ユーザー操作は必要ありません。
"DTC_GET_TRANSACTION_MANAGER_EX::ITransactionDispenser" の QueryInterface が失敗しました: 0x8004d028(MSDTC は DTC プロキシ dll を読み込みませんでした。)。
"ITransactionDispenser" の QueryInterface が失敗しました: 0x8004d028(MSDTC は DTC プロキシ dll を読み込みませんでした。)。
Microsoft 分散トランザクション コーディネーター (MS DTC) リソース マネージャー [db1] が解除されました。これは通知専用メッセーです。ユーザー操作は必要ありません。

Windows 版の場合、分散トランザクションが実行されたタイミングで「C:\Windows\SYSTEM32\MSDTCPRX.DLL」がロードされるのですが、Linux 版に関しては、この DLL が存在していません。
そのため、機能を有効化することができる、上記のようなエラーが発生し、DTC のリソースマネージャーとして、可用性グループで保護しているデータベースを追加することができないようです。
そのほかにも分散トランザクションが使用できないことで、

のような、DTC が利用される処理については

  • 「System.Data.SqlClient.SqlException」「メッセージ 8501、レベル 16、状態 3、行 xx」による「MSDTC on server ‘xxx’ is unavailable.」
  • 「TransactionPromotionException: トランザクションを進めるときにエラーが発生しました。」

のようなエラーにつながる可能性があります。
新規開発のシステムであれば、エラーが発生するため DTC を使っているかがわかりやすいですが、既存システムを SQL Server on Linux に移行する場合などは、パフォーマンスモニターの「Distributed Transaction Coordinator」の情報から、分散トランザクションが使用されているかどうかを確認してみるとよいのかもしれないですね。
参考

.NET Core については、2.1.0 から TransactionScope をサポートされるかも ということを、この投稿を書いていて初めて知りましたとさ。

Share

Written by Masayuki.Ozawa

12月 28th, 2017 at 5:12 pm

Leave a Reply