1. try-catch 안에서 예외는 잡았지만, 그 전에 이미 JPA flush가 일어났을 가능성
sale = saleRepository.save(sale); // 이 시점에서 flush 발생 가능성 ↑ (특히 IDENTITY 전략이면 즉시 insert됨)
그리고 그 이후의 코드에서 예외가 발생하면:
- catch로 잡더라도, 이미 flush된 상태에서 발생한 예외는 트랜잭션을 markRollbackOnly로 설정해버림
- 이후 커밋 시점에 Transaction silently fails with rollback
2. catch 했지만 예외가 RuntimeException 계열이 아니거나, 이미 rollback-only 상태였던 경우
- 트랜잭션은 RuntimeException / Error만 기본 롤백 대상
- checked exception은 rollback하지 않음
- 하지만 catch 이후에도 트랜잭션 상태가 이미
rollback-only
이면, 커밋 시도 시 무조건 rollback됨
결국 이벤트로 완전히 분리함.
상황 | 롤백 발생? | 이유 |
@Transactional 메서드 안에서 예외 발생하고, throw됨 | ✅ | 기본 롤백 대상 |
try-catch로 감싸고 예외 삼킴 | ❌ | 정상 커밋됨 |
try-catch로 감쌌지만 flush 이후 예외 발생 | ✅ | flush 시점에서 rollback-only 설정됨 |
try-catch로 감쌌지만 내부 프록시 미적용 | ✅ or ❌ | 트랜잭션이 안 먹힘 or 롤백 안됨 |
@TransactionalEventListener 사용 | ❌ | 트랜잭션 commit 이후에 동작 |