본문 바로가기
Spring Framework

@Transactional의 noRollbackFor 속성

by kmmguumnn 2019. 5. 2.

대개 Service layer에서, @Transactional 애노테이션을 붙여서 특정 메소드의 작업을 하나의 트랜잭션으로 처리하도록 할 수 있다.

 

이 때 한 @Transactional 메소드 내부에서 또 다른 @Transactional 메소드를 호출하면, 호출된(callee) 트랜잭션은 호출한(caller) 트랜잭션에 병합된다. 또한 호출된 트랜잭션을 수행하다가 에러가 발생했을 경우, 기본적으로 트랜잭션이 모두 rollback 처리 된다.

 

때에 따라서는 특정 트랜잭션은 rollback이 일어나지 않도록 하고 싶을 수도 있는데, 이 때 @Transactional의 'noRollbackFor' 라는 속성을 사용할 수 있다.

 

사용하는 방식은 다음과 같다.

@Transactional(noRollbackFor = { ExceptionA.class, ExceptionB.class })
public void insertItem() {
  ...
}

 

즉 noRollbackFor 속성에 정의한 Exception이 해당 트랜잭션 내부에서 발생할 경우, 진행한 부분까지 commit이 일어나며 rollback을 진행하지 않는다. 한 번에 여러 개의 Exception을 명시할 수 있고, 해당 Exception class는 Throwable의 서브클래스여야 한다.

댓글