spring @Transactional 롤백 미적용 해결

      spring @Transactional 롤백 미적용 해결에 댓글 없음

똑같은 문제로 고민하기 싫어서 작성하는 글이다. 스프링 환경에서 트랜잭션 처리(어노테이션 사용)가 제대로 되지 않아 시도해 본 방법을 작성한다. 구체적인 테스트 방법은 기억이 나질 않는다. 개념만 알고 있으면 될 것 같다.

1. 설정이 잘못됐나?

스프링 세팅을 내가 하지 않아서 제일 먼저 의심했다. 대부분의 예제 코드는 xml인데 반해 내 환경은 javaconfig였기에 시간을 많이 뺏겼다. 주의할 점은, 설정클래스에 @EnableTransactionManagement 을 등록해야 @Transactional을 인식할 수 있다. 

2. Exception 종류 의심

설정이 잘 되었다면 이 경우를 의심해보자. 기본적인 설정이라면 트랜잭션은 RuntimeException 발생 시에만 동작한다. 예를 들어, SQLException 등의 checked exception이 발생하면 동작하지 않는다. 이때, 동작하게 하기 위해서는 rollbackfor 속성을 추가해야 한다. 메서드 단위라면 어노테이션 옆에, 프로젝트 단위라면 설정클래스에!

** 문제가 해결 된 후 설정없이 SQLException 발생시켜봤는데, 잘 된다. 모든 글에서는 안된다고 나와있는데…

3. 내부 메서드 호출 시

나의 경우는 이 문제였다. 한 클래스에 A와 B라는 메서드가 각각 있다면, A에서 B를 호출할 때 B메서드에 @Transactional을 사용할 수 없다. 이 문제로 okky 커뮤니티에 질문을 올렸는데, 도움을 많이 받았다. 나와 같은 문제라면 내가 질문한 글을 꼭 참고하라.

4. try catch 문

@Transactional을 선언한 메서드 안에 try catch문을 사용할 경우이다. 이에 관련해서 잘 정리된 글을 참고하길 바란다.

 

더 많은 시도를 했지만 기억나는 건 이 정도이다.

참고링크