본문 바로가기
개발/Spring

@Transactional에 대한 정리[4] - rollbackFor(Class)에 관하여

by 설이주인 2023. 9. 11.

@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

 

@Transactional 상태에서 Exception이 발생했을 때 Rollback 동작 과정

@Transactional 어노테이션을 통해 트랜잭션을 선언하고 메서드 내부 로직을 짜던 중 '트랜잭션 안에서 발생하는 예외와 그 예외를 처리하는 방법에 따라 어떻게 롤백이 되는지'에 대한 개념이 명확

wildeveloperetrain.tistory.com