概要
SQLServerで分散トランザクションを利用するためにはいくつかの設定が必要です。
この手順が少し複雑だと感じたため、今回この記事で補足をしようと思います。
基本的な手順は、後述する前提条件にある記事を参考にしています。
またSQL Serverを提供しているMicrosoftの公式ドキュメントやIBMのドキュメントでも解説されており、この記事はそれらを私なりに補足しながらわかりやすくまとめなおしたものになります。
正確な情報は一次情報である公式ドキュメントを参考ください
記事にしようと思った経緯
- 分散トランザクションに関するドキュメントが少ないこと
- 公式ドキュメントは補足事項が少ないと感じたこと
- SQLServerのバージョンが古い場合の対応方法がわからなかったこと
対象者
この記事では、主に下記の方が対象者となります。
- (SQLServerで)分散トランザクションを検討中の方
- 実装してみたが、SQLServerの設定をしておらず詰まった方
環境情報
項目 | 対象情報 |
---|---|
OS | Windows |
ライブラリ | atomikos |
言語 | Java |
フレームワーク | SpringBoot |
参考記事・前提条件
手順はこちらの記事を参考にしています。
★1つのトランザクションで複数のDB(OracleとSQL Server)を更新するアプリケーションでAtomikosを利用してみた
分散トランザクションの実装方法についてまとめた私の記事です。
comming soon..
こちらは、下記の手順3で詰まった場合に参考になったGitHub issue上でのやり取りです。
翻訳すると、xa_install.sql
に関する情報のやり取りが確認できます。
sp_sqljdbc_xa_install と新しいドライバーリリースについて [GitHub issue]
手順
前提条件となる[★参考記事]を基に下記手順を行ってみてください。
- コンポーネントサービスからDTC(分散トランザクションコーディネーター)のXAトランザクションを有効にする
- SQL Server 構成マネージャーを起動し、SQL Serverのサービスを再起動させる
-
sys.sp_sqljdbc_xa_install
を実行し、分散トランザクションが利用できるようになる権限を付与する
SQL Server 2017以降の環境だと上記手順のみで分散トランザクションが正常に実装・実行できると思われます。
その場合は、これより下の手順は不要となります。
分散トランザクションを利用できる権限を付与する(手順3 別パターン)
SQLServerのバージョンが古いなどの理由で、sys.sp_sqljdbc_xa_install
が存在せず、【手順3】が実行できない場合は下記手順が必要です。
実はここからが、私が記事にして伝えたかったことになります。
(私はSQLServer2012の環境で作業を行っていたため、下記の方法で行っています)
この部分の手順については、公式ドキュメントにも一部記載がありますのでご一読ください。
権限付与の手順
- MicrosoftSQL Server JDBC DriverのダウンロードページからJDBC Driverをダウンロードする
- ダウンロードしたzipファイルを解凍し、内部のxa ディレクトリ配下に、
xa_install.sql
とsqljdbc_xa.dll
のファイルがあることを確認する -
sqljdbc_xa.dll
を分散トランザクションを使用する SQL Server インスタンス上の/Binn
配下にコピーする
例えば、C:\Program Files\Microsoft SQL Server\MSSQLFOGEFOGE\MSSQL\Binn
に配置します
※MSSQLFOGEFOGE
の部分は実際にはinstanceName
が入ると思います -
xa_install.sql
をMicrosoft SQLServer Management Studioやコマンドプロンプトなどで実行する - プログラムを実行して挙動を確認する
ここまで実施することで、分散トランザクションは正常に動作すると思います。
補足
手順を何も行っていない時点でプログラムを実行すると、下記のエラーメッセージが表示されました。(期待値の参考までに)
XA コントロール接続を作成できませんでした。エラー: "ストアド プロシージャ 'master..xp_sqljdbc_xa_init_ex'が見つかりませんでした。"
また、手順2番目終了時点でプログラムを実行すると、下記のエラーメッセージが表示されました。
SQLServerException: XA コントロール接続を作成できませんでした。エラー: "接続は閉じられています。"