スプリングトランザクション異常をどのように処理しますか?
Springにおけるトランザクション異常時のロールバック処理方法は、以下のように複数あります。
- 通常、Springのトランザクションマネージャは、キャッチされないRuntimeExceptionまたはErrorが発生したらトランザクションをロールバックします。つまり、メソッドの呼び出しが終了する時点でRuntimeExceptionまたはErrorがスローされると、トランザクションは自動的にロールバックされます。
- 特定の例外が発生したときにトランザクションをロールバックするように、@TransactionalアノテーションのrollbackFor属性を使用できます。たとえば、@Transactional(rollbackFor = Exception.class)は、Exception例外が発生したときにトランザクションをロールバックします。
- try-catch文で例外をキャッチし、catchブロック内でTransactionAspectSupport.currentTransactionStatus().setRollbackOnly()メソッドを手動で呼び出してトランザクションをロールバックします。例:
@Transactional
public void someMethod() {
try {
// 业务逻辑
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
throw e;
}
}
- tx:advice
- 翻訳native は日本語で1つのオプションのみが必要: tx:method
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
なお、上記のアプローチはあくまでSpringトランザクションマネージャで管理されるトランザクションに適用するものです。JTA(Java Transaction API)を利用して、分散型トランザクション管理を行う場合には、具体的なJTAの実装方式に応じて、異常時のロールバック処理を行う必要があります。