예외가 발생했을 때 Transactional 실패

윤지현·2024년 10월 11일

TIL

목록 보기
74/75

1. 문제

매니저 등록을 별개로 로그 테이블에는 항상 로그가 남도록 만들었다.

예외가 발생하도록 예외 "담당자를 등록하려고 하는 유저가 유효하지 않거나, 일정을 만든 유저가 아닙니다."가 발생한 후에 insert 쿼리가 발생했지만 테이블에 데이터가 들어가지 않았다.


2. 문제가 발생한 이유

기본 트랜잭션 롤백 규칙

  • Unchecked Exception (예: RuntimeException, NullPointerException, IllegalArgumentException 등)이 발생하면 트랜잭션이 자동으로 롤백됩니다.
  • Checked Exception (예: IOException, SQLException 등)이 발생하면 롤백되지 않고 커밋됩니다.

예외 처리하는 InvalidRequestException는 RuntimeException를 상속받았다.

트랜잭션 (@Transactional) 안에서 RuntimeException 이 발생하면 롤백이 발생하여 롤백 예외가 발생한다.

즉, InvalidRequestException가 발생하면 롤백이 발생한다.


해당 블로그를 통해 문제 발생이유를 알 수 있었다.

https://devlog-wjdrbs96.tistory.com/351


3. 해결방안

그래서 로그 저장 로직을 별도의 서비스로 분리하여, 그 서비스에 @Transactional(propagation = Propagation.REQUIRES_NEW)를 적용를 적용했다.

다시 한 번 예외처리가 발생했을 때, 로그 테이블에 데이터가 잘 commit되어 있다.

profile
첫 시작

0개의 댓글