블로그 이미지

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • @Transactional의 롤백
    Programming/Spring 2022. 5. 18. 19:37

    @Transactional 은 메서드 단위의 비즈니스 로직에서 쿼리가 실행된 뒤 예외가 발생했을 때 롤백 해주는 역할을 수행한다.

    RuntimeException을 상속한 예외에 대해서 롤백을 해준다는 배경지식만 있던 터라 미션에서 사용하고 있는 JdbcTemplate 은 어떻게 롤백이 진행되는 것인지 궁금하게 되었다.

    @Transactional 에서의 JdbcTemplate  쿼리 실행은 어떻게 롤백되지?

    @Transactional 은 기본적으로 rollbackFor 의 옵션이 RuntimeException.class 와 Error.class 로 설정 되어있다. JdbcTemplate 에서 예외가 터지면 SQLException 이 발생하는 줄 알았지만, JdbcTemplate의 쿼리 실행 메서드를 들어가보니 DataAccessException 을 던지고 있었다.

    public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
          @Override
          public void query(String sql, RowCallbackHandler rch) throws DataAccessException {
              query(sql, new RowCallbackHandlerResultSetExtractor(rch));
          }
    }

    DataAccessException 은 RuntimeException 을 상속한 예외이기 때문에, JdbcTemplate 의 쿼리 실행중 예외가 발생했을 때 @Transactional 의 롤백이 진행되는 것이다.

    JdbcTemplate 을 사용하지 않는다면?

    JdbcTemplate 을 사용하지 않아 SQLException 이 직접적으로 발생한다면, rollbackFor 옵션을 다음과 같이 바꿔주면 된다.

    @Transactional(rollbackFor = SQLException.class)
    public void service() {
    }

    댓글

Designed by Tistory.