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("체크 예외 발생!");
}
@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("롤백 안 함");
}
@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