@Transactional은 모든 예외를 롤백시키나요? #60
Replies: 4 comments
-
|
@transactional은 기본 설정만으로는 모든 예외를 롤백시키지 않습니다. 다만 이것은 자바 예외 자체의 규칙이라기보다는 스프링 트랜잭션의 기본 정책입니다. 결국 중요한 것은 “체크 예외냐 언체크 예외냐”를 외우는 것이 아니라, |
Beta Was this translation helpful? Give feedback.
-
|
@transactional에서 별도로 rollbackOn 옵션을 명시하지 않는다면, 체크 예외는 기본적으로 롤백하지 않습니다. 트랜잭션 기본 정책상, RuntimeException과 같은 언체크 예외나 Error의 경우에는 롤백을 수행하지만, IOException와 같은 체크 예외는 롤백되지 않고 커밋됩니다. 하지만 예외에 따라 트랜잭션이 어떻게 처리되어야 하는지 결정되는 것은 아니기에, 예외의 종류에 따라 롤백을 할지 말지 직접 설정할 수 있습니다.(추천해주신 영상에서 전달하고 싶은바도 이와 동일하다고 생각합니다.) 체크 예외도 롤백하고 싶은 경우, rollbackFor 옵션이나 rollbackOn 옵션을 사용하여 롤백하도록 정책을 변경할 수 있습니다.
import org.springframework.transaction.annotation.Transactional;
@Transactional(rollbackFor = Exception.class)
public void pay() throws Exception{
}
import jakarta.transaction.Transactional;
@Transactional(rollbackOn = Exception.class)
public void pay() throws Exception {
}언제 롤백을 하고, 언제 롤백을 하지 않을지 선택 기준임의로 롤백을 하도록 혹은 롤백하지 않도록 결정하는 기준은 트랜잭션 내의 예외가 비즈니스의 핵심상태를 깨뜨리는지 아닌지를 기준으로 결정하면 좋을 것같습니다. 예를 들어, 알림, 이벤트 발행처럼 부가 작업 실패인 경우는 실제 비즈니스의 핵심 상태를 깨지 않기에 롤백하지 않도록 설정하는 것이 더 좋을 것 같습니다. |
Beta Was this translation helpful? Give feedback.
-
|
모든 예외를 롤백하지는 않습니다.
Spring은 만약 체크 예외가 발생했을 때도 롤백이 필요하다면 아래와 같이 설정할 수 있습니다.(rollbackFor) 반대로 특정 예외가 발생해도 롤백하지 않으려면 아래와 같이 설정할 수 있습니다.( 추가로 예외를 메서드 내부에서 |
Beta Was this translation helpful? Give feedback.
-
|
기본적으로 Transactional은 모든 예외를 롤백하지 않습니다. 기본 동작은 언체크 예외(RuntimeException)와 Error만 롤백하고, |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
제 레벨 인터뷰에 나왔던 질문입니다!
알아보면 좋을 거 같아요~!
관련 영상
Beta Was this translation helpful? Give feedback.
All reactions