[Spring] @Transactional 롤백 설정

phdljr·2025년 4월 2일

기본 설정

Spring의 @Transactional은 기본적으로 런타임 예외(RuntimeException 또는 UncheckedException)가 발생하면 롤백하고, 체크 예외(CheckedException)가 발생하면 커밋한다.

@Transactional
public void someMethod() {
    // 데이터 저장
    repository.save(new Entity());

    // 예외 발생 -> 롤백
    throw new RuntimeException("예외 발생!");
}
@Transactional
public void someMethod() throws Exception {
    repository.save(new Entity());

    // CheckedException 발생 -> 기본적으로 롤백되지 않음
    throw new Exception("체크 예외 발생!");
}

트랜잭션 롤백 설정 변경 방법

  • 체크 예외도 롤백하고 싶다면 rollbackFor 속성을 설정하면 된다.
@Transactional(rollbackFor = Exception.class) // 모든 예외 롤백
public void someMethod() throws Exception {
    repository.save(new Entity());
    throw new Exception("체크 예외 발생!");
}

특정 예외 발생 시 롤백 제외

@Transactional(noRollbackFor = IllegalArgumentException.class) // 해당 예외 발생해도 롤백 안 함
public void someMethod() {
    repository.save(new Entity());
    throw new IllegalArgumentException("롤백 안 함");
}

프로그래밍적으로 롤백 설정 (TransactionAspectSupport)

@Transactional
public void someMethod() {
    try {
        repository.save(new Entity());
        if (someCondition) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    } catch (Exception e) {
        // 예외를 잡았기 때문에 기본적으로 롤백되지 않음
    }
}

출처

https://www.javamadesoeasy.com/2015/05/exception-handling-exception-hierarchy.html

profile
난 Java도 좋고, 다른 것들도 좋아

0개의 댓글