Springのトランザクションを明示的に管理にする方法についてメモ。
Springのトランザクション管理の中心となるインターフェイス
[PlatformTransactionManager]
PlatformTransactionManagerはトランザクション管理に必要なAPIを提供しており、
APIを呼び出すことでトランザクション操作を実行できます。
また、PlatformTransactionManagerはトランザクション管理の実装を抽象化するための
インターフェイスであるため、異なる種類のトランザクションを、種類の違いを意識をすることなく
同一のAPIで操作することができます。
(SpringはTransactionTemplateを推奨)
PlatformTransactionManagerの実装クラス
クラス名 | 説明 |
---|---|
DataSourceTransactionManager | JDBCおよびMyBatisなどのJDBCベースのライブラリによるデータベースアクセスを行う場合に使用する |
HibernateTransactionManager | Hibernateによるデータベースアクセスを行う場合に利用する |
トランザクションマネージャーの定義
- PlatformTransactionManagerのBean定義
- トランザクション対象とするメソッドを定義
ローカルトランザクションを利用する場合
ローカルトランザクションを使用する場合は、JDBCのAPIを呼び出してトランザクション制御を行う
DataSourceTransactionを使用します。
ローカルトランザクションとは、単一のデータストアに対するトランザクションのことで、
一般的によく使われるトランザクションです。
例えば、単一のデータベースに対する複数の操作を1つの論理的な単位で処理したい場合に使われます。
<!-- BeanIDには"transactionManager"を指定するのがオススメ -->
<!-- Springのデフォルトとして、トランザクションのBeanIDを"transactionManager"としているため -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- @Transactionアノテーションを利用する場合 -->
<tx:annotation-driven>
明示的トランザクション
プログラム的トランザクションとは、コミットやロールバックといったトランザクション制御に関する処理を
ソールコードに明示的に記述する方法のこと。
メソッド単位より細かい粒度でトランザクション制御を行いたい場合などに有効。
トランザクションの分離レベル
トランザクションの分離レベルには、参照するデータや変更したデータを他のトランザクションと
どのように分離するかを指定します。
分離レベルは、複数トランザクションの同時実行とデータの一貫性に関係します。
トランザクション分離レベル | 説明 |
---|---|
DEFAULT | 利用するデータベースのデフォルトの分離レベル |
READ_UNCOMMITTED | ダーティリード、ノンリピータブルリード、ファントムリードが発生する |
READ_COMMITTED | ダーティリードを防止するが、ノンリピータブルリード、ファントムリードは発生する |
REPEATABLE_READ | ダーティリード、ノンリピータブルリードを防止するが、ファントムリードは発生する |
SERIALIZABLE | ダーティリード、ノンリピータブルリード、ファントムリードを防止する |
トランザクション伝播レベル
トランザクションの伝播レベルには、トランザクション境界でトランザクション参加する方法を指定します。
指定する値によって、「新たにトランザクションを開始するもの」
「すでに開始されているトランザクションに相乗りするもの」などがあります。
トランザクション境界と伝播レベル
※後ほど記載
Springで利用可能なトランザクション伝播レベル
伝播レベル | 説明 |
---|---|
REQUIRED | 現在のトランザクションを継続して利用する。もしその時点でトランザクションが存在しない場合、トランザクションを新規に作成し、開始する |
REQUIRED_NEW | 必ず新規のトランザクションを作成し、開始する。もしその時点でトランザクションがすでに存在している場合、新規のトランザクションがするまでの開いた、現在のトランザクションを一時的に停止する |
MANDATORY | 現在のトランザクションを継続して利用する。もしその時点でトランザクションが存在しない場合は、例外が発生する |