今回は、@Transactionalアノテーションについてまとめていこうと思います。
@Transactionalの属性
@Transactionalには属性を使うことができますが、属性は以下となります。
- isolation
- Transactionのisolation Levelで、別途指定がなければDBのisolation Levelを従う。
- 例:@Transactional(isolation=Isolation.DEFAULT)
- propagation
- どのような場合にトランザクションを開始するか等の属性を指定する。デフォルトはREQURIED
- 例:@Transactional(propagation=Propagation.REQUIRED)
- readOnly
- 読み取り専用かどうかを指定する。デフォルトはfalse。
- 例:@Transactional(readOnly = true)
- rollbackFor
- 検査例外が発生した際もロールバックしたい場合に指定する。
- 例:@Transactional(rollbackFor=Exception.class)
- noRollbackFor
- ロールバックしたくない場合に指定する。
- 例:@Transactional(noRollbackFor=Exception.class)
- timeout
- そのトランザクションがタイムアウトする時間を指定する(秒指定)。デフォルトは利用しているトランザクション管理システムのタイムアウトを利用する。
- 例:@Transactional(timeout=10)
Isolation Level(隔離レベル)
Transactionで一貫性がないデータを許容するレベルで、いろんなTransactionが他のTransactionの邪魔から保護されるレベルです。
- DEFAULT
- 利用するデータストアのデフォルト分離レベルを利用する。
- READ_UNCOMMITTED
- ダーティーリード・ファジーリード・ファントムリードが発生する可能性がある。
- READ_COMMITTED
- ダーティーリードは発生しないが、ファジーリード・ファントムリードは発生する可能性がある。
- REPEATABLE_READ
- ダーティーリード・ファジーリードは発生しないが、ファントムリードは発生する可能性がある。
- SERIALIZABLE
- ダーティーリード・ファジーリード・ファントムリードは発生する可能性がない。
Propagation Behavior
mvc-dispatcher-servlet.xml配下のcomponent-scanでパッケージを明示しなければならないです。
- PROPAGATION_REQUIRED
- 既存のTransactionが存在したらそのTransactionを実行
- なければ新しいTransactionを実行する。
- 一番よく使われるオプション
- PROPAGATION_SUPPORTS
- 既存のTransactionが存在したらそのTransactionを実行
- なければトランザクションなしで実行する。
- PROPAGATION_MANDATORY
- 既存のTransactionが存在したら既存のトランザクションを実行
- なければ例外をスローする。
- PROPAGATION_REQUIRES_NEW
- 既存のTransactionが存在したらそのTransactionを実行
- なければ新規にトランザクションを実行する。
- PROPAGATION_NOT_SUPPORTED
- 既存のTransactionが存在したら既存のトランザクションを停止し、トランザクションなしで実行
- なければトランザクションなしで実行する。
- PROPAGATION_NEVER
- 既存のTransactionが存在したら例外をスローする。
- なければトランザクションなしで実行する。
- PROPAGATION_NESTED
- 既存のTransactionが存在したら既存のトランザクションを利用し、その部分だけネストしたトランザクションのように処理されます。
- なければ新規にトランザクションを開始する。
