TIL

Spring 트랜잭션 RollbackFor

하얀잔디 2025. 5. 22. 16:54

 

-> 특정 상황에 rollback 할지 말지를 정하는것.

 

대충 예상되는 에러에 대해선 롤백하기 싫을 경우 -> noRollbackFor.

롤백 범위를 좀 넓히고 싶은경우 ( checked Exception 등 ) -> RollbackFor 이라고 생각하면 편함.

 

 

-----

 

 

이번엔 Spring에서 자주 놓치는 @Transactional의 다른 옵션들,

특히 rollbackFor, noRollbackFor, readOnly에 대해 경험 기반으로 정리.

 

상황

서비스 코드에서 try-catch로 감싼 로직이 있는데, 분명 예외가 발생했는데 DB에 insert된 데이터가 커밋됨.

이유?

Spring 트랜잭션은 기본적으로 RuntimeException 계열에서만 자동 롤백을 한다.
즉, checked exception (예: IOException, SQLException)은 예외가 발생해도 트랜잭션을 롤백하지 않음.

 

-> 잠시 헷갈릴 수 있는 예외 정리하기. ( 추후 ) 

 

@Transactional(rollbackFor = [Exception::class])
fun processReservation() {
    // checked exception 발생 시에도 롤백됨
    throw IOException("예약 처리 중 파일 에러")
}

 

 

@Transactional(noRollbackFor = [AlarmSendException::class])
fun saveReservation() {
    reservationRepository.save()
    alarmService.send()  // AlarmSendException 발생해도 rollback 안 됨
}

'TIL' 카테고리의 다른 글

istio란?  (0) 2025.05.29
Kafka 동시에 같은 이벤트 들어오는 경우  (0) 2025.05.25
Spring 트랜잭션 전파 레벨  (0) 2025.05.22
Flutter 앱 아이콘 / 스플래시 이미지 적용법  (0) 2025.05.21
UNDO 공간부족 오류란  (0) 2025.05.20