명시적 Rollback
↩️ 명시적 Rollback
정의
명시적 Rollback은 개발자가 특정 조건에서 트랜잭션을 직접 롤백 상태로 표시하는 방식이다. Spring의 기본 자동 롤백 규칙 외에, 비즈니스 조건에 따라 강제로 롤백해야 할 때 사용한다.
Spring은 기본적으로 RuntimeException 발생 시 자동 롤백을 수행한다.
하지만 예외를 던지지 않고도 롤백해야 하는 상황에서는 명시적 처리가 필요하다.
🧩 역할
- 트랜잭션을 개발자가 직접 롤백 상태로 만든다
- 예외를 던지지 않아도 롤백을 지정할 수 있다
- 비즈니스 조건에 따른 정교한 제어가 가능하다
🛠 설정 방법
TransactionAspectSupport 사용
Spring AOP의 트랜잭션 관리 안에서 현재 트랜잭션 상태를 가져와 강제로 롤백을 지정할 수 있다.
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
이 메서드는 현재 진행 중인 트랜잭션을 커밋하지 않고 롤백 대상으로 표시한다.
🛠 사용 예시
비즈니스 로직에서 조건에 따른 롤백
@Service
@Transactional
public class OrderService {
public void placeOrder(Order order) {
orderRepository.save(order);
if (order.getAmount() > 10000) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return;
}
}
}
예외를 던져 롤백하는 방식
@Transactional
public void process(Order order) {
if (order.getAmount() > 10000) {
throw new IllegalStateException("금액 초과");
}
}
⚠️ 주의사항
- 트랜잭션 범위 안에서만 사용할 수 있다.
setRollbackOnly()이후에는 해당 트랜잭션을 커밋할 수 없다.- 너무 자주 사용하면 흐름이 숨겨져서 유지보수가 어려워질 수 있다.
- 예외 기반 롤백과 명시적 롤백을 섞을 때는 의도를 분명히 해야 한다.
📌 정리
- 명시적 Rollback은 개발자가 직접 트랜잭션을 롤백 상태로 만드는 방식이다.
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()로 처리할 수 있다.- 예외를 던지지 않는 비즈니스 조건에서도 롤백을 제어할 수 있다.
댓글남기기