try catch가 안통하고 silently rolledBack 이슈

생성일
Apr 18, 2025 12:57 AM
최종 편집 일시
Last updated April 18, 2025
태그
JAVA

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 이후에 동작