技術メモ

技術メモ

ラフなメモ

Springのトランザクション管理機構を試す

宣言的トランザクション管理

トランザクションそのものの説明は割愛します。本稿ではSpringの @Transaction を用いたトランザクション管理機構について考えてみます。

概要

宣言的トランザクションのイメージから掴んだほうがわかりやすいと思います。以下のようにトランザクション管理したいメソッドに @Transactional を付与するのみで実現できます。メソッドの開始がトランザクションの開始、メソッドの終了がトランザクションの終了になります。

@Transactional
public void doSomething() {
    // トランザクションが必要ななんらかの処理
    // 非検査例外の発生でロールバックする
}

特徴

@Transactional を用いたSpringのトランザクション管理機構は以下のような特徴があります。

デフォルト値

@Transactional のデフォルト設定値

プロパティ値 デフォルト値 説明
value String - (オプション)利用するトランザクションマネージャーを指定する
propagation enum: Propagation PROPAGATION_REQUIRED プロパゲーションの設定
isolation enum: Isolation ISOLATION_DEFAULT 分離レベルの設定。プロパゲーションが REQUIRED または REQUIRES_NEW の場合のみ有効
timeout int (in seconds of granularity) - (オプション)トランザクションタイムアウト値。プロパゲーションが REQUIRED または REQUIRES_NEW の場合のみ有効
readOnly boolean Read-write 読み取り専用または読み書き可能か指定。プロパゲーションが REQUIRED または REQUIRES_NEW の場合のみ有効
rollbackFor Class<? extends Throwable> - (オプション)ロールバックさせるチェックされる例外クラスの配列を指定
rollbackForClassName String - (オプション)ロールバックさせるチェックされる例外クラスの名前の配列を指定
noRollbackFor Class<? extends Throwable> - (オプション)ロールバックさせない例外クラスの配列を指定
noRollbackForClassName String - (オプション)ロールバックさせない例外クラスの名前の配列を指定

例えば、任意の例外が発生した場合にロールバックしたい場合は以下のようなアノテーションになります。

@Transactional(rollbackFor = Throwable.class)
public void doSomething() {
    // トランザクションが必要ななんらかの処理
    // 任意の例外発生でロールバックする
}

propagationのイメージ

PROPAGATION_REQUIRED の場合は、すでに外部のトランザクションが開始している場合はそのトランザクショントランザクションを実施します。まだトランザクションが開始していない場合は新規にトランザクションを開始します。

f:id:tutuz:20190604230253p:plain

https://docs.spring.io/autorepo/docs/spring/5.1.7.RELEASE/spring-framework-reference/data-access.html#transaction-declarative より引用

トランザクションを束ねることができるので、あるメソッドから呼び出すトランザクションが全て不可分であれば PROPAGATION_REQUIRED でよいと思います。

おわりに

試したときのソースはGitHubに上げておきました。

github.com

参考

*1:RuntimeExceptionとそのサブクラス

*2:RuntimeExceptionとそのサブクラス以外