-> 특정 상황에 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 |