複数のデータベース間で一連のデータ操作を行うことを「分散トランザクション」といい、分散トランザクションにおいてデータの整合性を管理できるオープンソースのJavaライブラリに「Atomikos」がある。今回は、Atomikosを利用したサンプルプログラムを作成してみたので、共有する。
なお、トランザクション・分散トランザクションの概念については、以下のサイトを参照のこと。
https://qiita.com/yShig/items/0168e651d6f3ef105f35
また、今回のサンプルプログラムは長くなるため、前提条件と完成したサンプルプログラムの画面イメージのみ記載し、ソースコードの内容は次回の記事で記載する。
前提条件
下記記事の実装が完了していること。
また、以下のように、USER01ユーザー・USER02ユーザーの各スキーマに、user_dataテーブルとm_sexテーブルに以下のデータが作成されていること。
完成した画面イメージとログの共有(正常更新時)
データベースが正常に更新される場合の画面・コンソールログの内容は、以下の通り。
1) Spring Boot起動時のコンソールログは、以下の通り
2) Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスし、「検索」ボタンを押下
6) 以下のように入力画面が表示されるので、入力データを指定後「確認」ボタンを押下
9) 登録完了後のコンソールログは以下の通りで、赤枠部分がデータinsert時のログである
10) 登録完了後のDB内容は以下の通りで、「テスト プリン4」がUSER01,USER02の両方のデータベースに追加されている
13) 以下のように入力画面が表示されるので、データを更新後「確認」ボタンを押下
16) 更新完了後のコンソールログは以下の通りで、赤枠部分がデータupdate時のログである
17) 更新完了後のDB内容は以下の通りで、「テスト プリン4」のデータがUSER01,USER02の両方のデータベースで更新されている
22) 削除完了後のコンソールログは以下の通りで、赤枠部分がデータdelete時のログである
23) 削除完了後のDB内容は以下の通りで、「テスト プリン4」のデータがUSER01,USER02の両方のデータベースから削除されている
完成した画面イメージとログの共有(異常更新時)
データベースの更新に失敗した場合の画面・コンソールログの内容は、以下の通り。
1) あらかじめ、以下のようにデータを設定しておく。すると、ID=4のデータを追加しようとすると、USER02のデータベース更新時にエラーになる
2) 一覧画面にはUSER01スキーマのデータが表示される。ここで「データ追加」ボタンを押下
3) 以下のように入力画面が表示されるので、入力データを指定後「確認」ボタンを押下
5) データ更新に失敗するため、以下のエラー画面が表示される
6) エラー画面遷移後のコンソールログは以下の通りで、赤枠部分で、データ追加時に一意制約エラーが発生していることが確認できる
7) エラー画面遷移後のDB内容は以下の通りで、データが更新されていないことが確認できる