Spring Boot DB連携

Oracle上でSpring Bootの@Transactionalアノテーションの挙動を調べてみた

Spring Bootを利用したアプリケーションでDB接続を利用する際、@Transactionalアノテーションをつけたメソッド内でDB更新処理を実装するようにすると、そのメソッド単位で、DB更新処理が成功した場合にコミットし、失敗した場合にロールバックをすることができる。

今回は、Spring Bootアプリケーション内でMyBatisフレームワークを利用する状態で、Oracleに接続し@Transactionalアノテーションの挙動を調べてみたので、共有する。

前提条件

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

OracleのIN句で1000件を超える項目を指定してみたOracleデータベースの場合、IN句で1000件を超える項目を指定するとエラーになってしまうので、注意が必要である。 今回は、S...

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

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

USER_DATAテーブルのデータを格納するエンティティクラスの内容は以下の通り。

また、UserDataMapper.java、UserDataMapper.xmlの内容は以下の通りで、データ取得・データ更新を行うためのSQLを定義している。



「EaseUS Todo Backup」は様々な形でバックアップ取得が行える便利ツールだったパソコン内のデータを、ファイル/パーティション/ディスク等の様々な単位でバックアップしたり、バックアップのスケジュール設定や暗号化設定も...

さらに、サービスクラスの内容は以下の通りで、transUserDataメソッド内でDB更新を2回実行していて、@Transactionalアノテーションを付与している。



freelance hubを利用して10万件を超える案件情報からJava Spring案件を検索してみたfreelance hubは、レバテックフリーランスやフリエン(furien)を始めとした多くのフリーランスエージェントの案件をまとめて...

また、Spring Bootのメインクラスの内容は以下の通りで、サービスクラスのtransUserDataメソッドを呼び出している。

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



「DesignEvo」は多くのテンプレートからロゴを簡単に作成できるツールだった多くのテンプレートが用意されていてロゴを簡単に作成できるツールの一つに、「DesignEvo」があります。今回は、「DesignEvo」...

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

サンプルプログラムの実行結果は以下の通りで、同一トランザクション内でDB更新が成功するとコミット、失敗するとロールバックされることが確認できる。

1) 以下のように、DemoServiceクラスの2回目の氏名更新時の設定値を、更新成功する値に設定する。
サンプルプログラムの実行結果_1

2) 1)の状態でSpring Bootのメインクラス(DemoApplication.java)を実行した結果、コンソールログに出力される内容は以下の通り。
サンプルプログラムの実行結果_2

3) 1)の状態で、実行前後でUSER_DATAテーブルの値を確認した結果は以下の通りで、コミットされ氏名が更新されることが確認できる。

<実行前>

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

<実行後>

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



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

4) 以下のように、DemoServiceクラスの2回目の氏名更新時の設定値を、更新失敗する値に設定する。
サンプルプログラムの実行結果_4

5) 4)の状態でSpring Bootのメインクラス(DemoApplication.java)を実行した結果、コンソールログに出力される内容は以下の通りで、DB更新エラーが発生していることが確認できる。
サンプルプログラムの実行結果_5

6) 4)の状態で、実行前後でUSER_DATAテーブルの値を確認した結果は以下の通りで、ロールバックされ氏名が更新されないことが確認できる。

<実行前>

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

<実行後>

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

要点まとめ

  • Spring Bootを利用したアプリケーションでDB接続を利用する際、@Transactionalアノテーションをつけたメソッド内でDB更新処理を実装するようにすると、そのメソッド単位で、DB更新処理が成功した場合にコミットし、失敗した場合にロールバックをすることができる。