MENU
Spring Boot DB連携

1つのトランザクションで複数のDB(OracleとSQL Server)を更新するアプリケーションでAtomikosを利用してみた

複数のデータベース間で一連のデータ操作を行うことを「分散トランザクション」といい、分散トランザクションにおいてデータの整合性を管理できるオープンソースのJavaライブラリに「Atomikos」がある。

トランザクション・分散トランザクションの概念については、以下のサイトを参照のこと。
https://qiita.com/yShig/items/0168e651d6f3ef105f35

今回は、Spring Bootアプリケーション内でMyBatisフレームワークを利用する状態で、1つのトランザクションで複数のDB(OracleとSQL Server)を更新する処理を記載し、その際にAtomikosを利用するサンプルプログラムを作成してみたので、共有する。

前提条件

下記記事の実装が完了していること。

1つのトランザクションで複数のDBを更新するアプリケーションでChainedTransactionManagerを利用してみたSpring Bootを利用したアプリケーションでDB接続を利用する際、@Transactionalアノテーションをつけたメソッド内でD...

やってみたこと

  1. SQL Serverで分散トランザクションを利用するための設定
  2. サンプルプログラムの作成
  3. サンプルプログラムの実行結果

SQL Serverで分散トランザクションを利用するための設定

SQL Serverで分散トランザクションを利用できるようにするには、いくつかの設定変更が必要である。その手順は、以下の通り。

1) スタートメニューで「コンポーネント」を入力するなどして、コンポーネントサービスを開く。
SQLServerの設定_1

2) 「Distributed Transaction Coordinator」内、「ローカル DTC」の「プロパティ」を選択する。
SQLServerの設定_2

3) 「セキュリティ」タブで「XA トランザクションを有効にする」にチェックを入れ、「OK」ボタンを押下する。
SQLServerの設定_3

4) 下記ダイアログが表示されるため、「はい」ボタンを押下する。
SQLServerの設定_4

5) MSDTCサービスを再開した旨のダイアログが表示されるため、「OK」ボタンを押下する。
SQLServerの設定_5

6) SQL Server 構成マネージャーを起動するため、「C:\Windows\SysWOW64」フォルダ内の「SQLServerManager15.msc」を選択しダブルクリックする。
SQLServerの設定_6

なお、SQL Server 構成マネージャーについては、以下のサイトを参照のこと。
https://docs.microsoft.com/ja-jp/sql/database-engine/configure-windows/start-stop-pause-resume-restart-sql-server-services?view=sql-server-ver15#sql-server-configuration-manager

7) SQL Serverのサービスから「SQL Server(MSSQLSERVER)」を選択し右クリックし、「再起動」メニューを押下する。これで、SQL Serverが再起動される。
SQLServerの設定_7_1

SQLServerの設定_7_2 SQLServerの設定_7_3 SQLServerの設定_7_4

8) 分散トランザクションを利用できる権限を付与するため、SSMS(SQL Server Management Studio)でSQL Serverに接続後、ストアドプロシージャ「sys.sp_sqljdbc_xa_install」を実行する。
SQLServerの設定_8



Code VillageはJavaScriptを中心としたサポート体制が充実したプログラミングスクールだったJavaScriptや、JavaScriptのフレームワーク「React」「Vue」を中心にオンラインで学習できるプログラミングスクール...

サンプルプログラムの作成

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから追加/変更したプログラムである。

build.gradleの内容は以下の通りで、Atomikosを利用するためのライブラリを追加している。

また、OracleとSQL Serverへ接続するための定義クラスは以下の通りで、データソースの生成にAtomikosを利用できるようにしている。

さらに、Atomikosで利用する、トランザクション管理を行うJtaTransactionManagerを生成しているクラスの定義は、以下の通り。



また、サービスクラスの内容は以下の通りで、Atomikosを利用して、OracleとSQL Serverのユーザーデータテーブル(user_data)を1つのトランザクションで更新する処理を定義している。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-oracle-sqlserver-atomikos/demo



「AOMEI Backupper」は様々な形でバックアップ取得や同期処理が行える便利ツールだったパソコン内のデータを、ファイル/パーティション/ディスク等の様々な単位でバックアップしたり、バックアップ時のスケジュール設定やリアルタイ...

サンプルプログラムの実行結果

サンプルプログラムの実行結果は、以下の記事に記載した内容と同じで、同一トランザクション内でOracleとSQL Serverの両方のDB更新が成功するとコミット、どちらか1つでも失敗するとロールバックされることが確認できる。

1つのトランザクションで複数のDBを更新するアプリケーションでChainedTransactionManagerを利用してみたSpring Bootを利用したアプリケーションでDB接続を利用する際、@Transactionalアノテーションをつけたメソッド内でD...

要点まとめ

  • 複数のデータベース間で一連のデータ操作を行うことを「分散トランザクション」といい、分散トランザクションにおいてデータの整合性を管理できるオープンソースのJavaライブラリに「Atomikos」がある。
  • SQL Serverの場合、XA トランザクションを有効にする設定を行ってSQL Serverを再起動した後で、ストアドプロシージャ「sys.sp_sqljdbc_xa_install」を実行することで、分散トランザクションを利用できる。