Springのトランザクション管理機構を試す
宣言的トランザクション管理
トランザクションそのものの説明は割愛します。本稿ではSpringの @Transaction
を用いたトランザクション管理機構について考えてみます。
概要
宣言的トランザクションのイメージから掴んだほうがわかりやすいと思います。以下のようにトランザクション管理したいメソッドに @Transactional
を付与するのみで実現できます。メソッドの開始がトランザクションの開始、メソッドの終了がトランザクションの終了になります。
@Transactional public void doSomething() { // トランザクションが必要ななんらかの処理 // 非検査例外の発生でロールバックする }
特徴
@Transactional
を用いたSpringのトランザクション管理機構は以下のような特徴があります。
- Spring Frameworkに付随しているAOPを用いて実現
- トランザクションの動作をメソッドレベル(インターフェースやクラスレベルはもちろん)で定義することが可能
- ロールバックは非検査例外*1にのみ適応され、検査例外*2に関してはデフォルトではロールバックされずコミットされる
- ただし例外に応じたロールバックするかどうかを設定可能
デフォルト値
@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 の場合は、すでに外部のトランザクションが開始している場合はそのトランザクションでトランザクションを実施します。まだトランザクションが開始していない場合は新規にトランザクションを開始します。
トランザクションを束ねることができるので、あるメソッドから呼び出すトランザクションが全て不可分であれば PROPAGATION_REQUIRED
でよいと思います。
おわりに
試したときのソースはGitHubに上げておきました。