본문 바로가기
Spring

스프링 트랜잭션에서 RuntimeException이 발생하면 롤백이 발생하는 이유

by 에드박 2021. 1. 17.

(참고 : woowabros.github.io/experience/2019/01/29/exception-in-transaction.html)

  • CheckedException : 예외 발생 시트랜잭션을 롤백하지 않고 예외를 던져줍니다.
  • UncheckedException : 예외 발생 시 트랜잭션을 roll-back 합니다.
  • roll-back이 되는 범위가 달라지기 때문에 개발자가 이를 인지하지 못하면 실행 결과가 맞지않거나 예상치 못한 예외가 발생할 수 있습니다.

스프링의 선언적 트랜잭션 (@Transactional) 안에서 RuntimeException 이 발생하면 롤백이 발생하여 롤백 예외가 발생합니다. (try-catch 문을 이용해서 RuntimeException을 잡더라도 롤백이 발생합니다!)

 

출처 : https://woowabros.github.io/experience/2019/01/29/exception-in-transaction.html
출처 : https://woowabros.github.io/experience/2019/01/29/exception-in-transaction.html

위의 코드는 OuterService에 있는 메서드는 클래스의 트랜잭션 선언에 의해 트랜잭션메서드가 됩니다. 그리고 그 메서드는 또 다른 트랜잭션 클래스의 메서드를 호출합니다. 호출된 내부 메서드는 결과적으로 마지막에 RuntimeException을 던집니다.

 

결과적으로 이 코드를 실행하면 UnexceptedRollbackException이 발생합니다. 즉, 롤백이 발생합니다.

 

스프링은 내부적으로 트랙잭션 중 RuntimeException이나 Error가 발생하면 try-catch문을 거치지 않고 예외가 던져지면서 트랜잭션 완료처리가 시작됩니다. 참여한 트랜잭션에 rollback-only를 마킹을 합니다. 그리고 최종 커밋을 할 때 rollback-only가 마킹되어 있는것을 확인하고 롤백을 합니다.

 

 

스프링의 트랜잭션에서는 왜 RuntimeException이나 Error을 왜 롤백 대상으로 볼까?

이전에 설명한것처럼 CheckedException은 예상 가능한 예외이고 UncheckedException은 예상치못한 예외라서 롤백이 진행되는 것입니다. (default 설정일때)

 

해당 스프링의 트랜잭션에서 RuntimeException 발생 시 롤백하는 과정은 아래의 링크(우아한 기술 블로그의 구인본님께서 쓰신 글)에서 자세히 읽으실 수 있습니다. (글도 굉장히 재밌게 쓰셨습니다!)

 

 

응? 이게 왜 롤백되는거지? - 우아한형제들 기술 블로그

이 글은 얼마 전 에러로그 하나에 대한 호기심과 의문으로 시작해서 스프링의 트랜잭션 내에서 예외가 어떻게 처리되는지를 이해하기 위해 삽질을 해본 경험을 토대로 쓰여졌습니다. 스프링의

woowabros.github.io

 

댓글