@Transactional은 UncheckedException에 대해서 rollback이 이뤄진다. 하지만 CheckedException 또한 Exception이자면 exception인데... 모든 Exception에 대해서 처리하고 싶으면 어떻게 진행해야 하늗가?
@Transactional(rollbackFor = Exception.class)으로 진행한다.
checked, uncehcek 둘의 부모 클래스는 결국 Exception.class이기에 @Transcational(rollbackFor = Excpetion.class)으로 보든 exception에 rollback을 진행한다.
앞서 Transaction이 진행되는 상황에서
TransactionAspectSupprt가 call 되는 상황임을 알 수 있는데, 이 때 불려지 completeTransactionAfterThrowing()안에 rollbackOn이 실행 되는데
TransactionAspectSupport.completeTransactionAfterThrowing > TransactionAttribute.rollbackOn > RuleBasedTransactionAttribute.rollbackOn()으로 진행된다.
RuleBasedTransactionAttribute.rollbackOn()의 설명을 다시 확인해보면
If no rule applies(-1), return false라고 설명한다.
하지만 우리는 @Transaction(rollbackFor = Exception.class)로 진행할 예정이기에 true(?)를 리턴하겠지..?
그럼 다시 try안의 txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus())가 진행된다.
PlatformTransactionManager.rollback() > AbstractPlatformTransactionManager.rollback() > AbstractPlatformTransactionManager.processRollback()을 진행한다.
상세히 다 기억하기에는 너무 광범위하기에 만약에 UncheckedException, CheckedException에 대해서 둘 다 rollback을 원한다면 @Transactional(rollbackFor = Exception.class)로 진행하는 것을 기억해두자.
//여러 개의 예외를 지정하는 방법*
@Transactional(rollbackFor = {RuntimeException.class, Exception.class})
//특정 예외가 발생하면 롤백이 되지 않도록 하는 방법*
@Transactional(noRollbackFor = {RuntimeException.class})
참고 URL
https://wildeveloperetrain.tistory.com/218
'개발 > Spring' 카테고리의 다른 글
@RequsestBody와 Setter (0) | 2023.09.18 |
---|---|
@Transactional에 대한 정리[번외] - RuntimeException와 Errorcode (0) | 2023.09.11 |
@Transactional에 대한 정리[3] - rollback()에 관하여 (0) | 2023.09.11 |
@Transactional에 대한 정리[2] - (readOnly=true)에 관하여 (0) | 2023.09.11 |
@Transactional에 대한 정리 [1] (0) | 2023.09.11 |