inflearn logo
강의

Course

Instructor

Spring DB Part 2 - Data Access Utilization Technology

트랜잭션 전파 기본 - UnexpectRollbackException 관련 질문

132

jalddak

11 asked

0

만약에 @Transactional 어노테이션을 사용해서 트랜잭션을 만들었을때
내부 트랜잭션에서 롤백이 발생했다는건
일반적인 상황에서는 database에서 뭔가 예외가 발생해서 그런거라고 생각되는데,
그러면 예외처리기에서 알아서 runtimeException을 상속받은 예외로 바뀔것이고
외부 트랜잭션에서도 롤백이 발생한다는건
이 경우는 database에서 발생했던 예외가 외부 트랜잭션까지 넘어와서 자연스럽게 롤백된거라고 생각합니다.
그래서 UnexpectRollbackException이 발생하지 않는다고 생각됩니다.

 

  1. 제 생각이 맞나요?


  2. 그러면 UnexpectRollbackException 이 발생할 수 있는 경우는 뭐가 있나요?

     

 

강의에서 처럼 의도적으로 문제를 일으키는게 아니면 생각나는 경우가 딱히 없습니다.
하지만 제가 생각하지 못하는 것이지 예외가 발생한다는 경우가 있긴 있다는것이겠죠?

 

  1. 그렇다면 트랜잭션을 이용하는 순간부터는 그냥
    @ControllerAdvice 에서
    @ExceptionHandler로
    UnexpectRollbackException을 캐치해줘서 처리하는 코드를 거의 무조건 작성해야할까요??

 

spring mvc jpa querydsl spring-data-mybatis spring-jpa 트랜잭션 transaction

Answer 2

1

yh

안녕하세요. 한현진님

AI 인턴의 설명에 추가로 다음 내용들을 보시면 도움이 되실거에요.

https://techblog.woowahan.com/2606/

https://velog.io/@minnseong/UnexpectedRollbackException-%EB%B0%9C%EC%83%9D

참고로 자주 발생하는 문제는 아니니 실제 문제가 발생했을 때 고민하셔도 괜찮습니다.

감사합니다.

1

jalddak

답변 감사합니다. 참고 되었습니다.

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 한현진님.

트랜잭션 전파에서의 UnexpectedRollbackException은 조금 혼란스러운 주제일 수 있습니다. 다음은 관련 설명 및 유사한 질문들에 대한 답변입니다.

스프링 트랜잭션 전파에서는 내부 트랜잭션에서 롤백이 발생해도 외부 트랜잭션에서 이를 처리하지 못하면 UnexpectedRollbackException이 발생할 수 있습니다. 이는 주로 외부 트랜잭션이 정상적으로 커밋될 것이라 예측했으나, 내부에서 롤백된 경우 발생하는 상황입니다.

  1. 한현진님의 이해: 말씀하신 것처럼, 외부 트랜잭션에서의 롤백은 데이터베이스 예외가 전달되어 발생할 수 있습니다. 그러나 UnexpectedRollbackException은 주로 내부 트랜잭션에서 예외가 발생하여 롤백되었음에도 외부 트랜잭션이 롤백을 예상하지 못하고 커밋을 시도할 때 발생합니다.

  2. UnexpectRollbackException 발생 경우: 이 예외는 내부 메서드의 롤백이 외부 메서드에 전파되지 않을 때 주로 발생합니다. 외부 메서드에서는 트랜잭션이 정상 커밋될 것이라 예상했지만, 내부 메서드의 예외로 인해 롤백되어 결과가 예상치 못한 경우입니다.

관련 질문과 답변:
- 트랜잭션 전파 관련 질문 있습니다에서는 비슷한 논의를 하고 있습니다. 내부 트랜잭션과 외부 트랜잭션의 롤백/커밋이 각각 어떻게 처리되고 예외가 날 수 있는지에 대한 설명입니다.

ExceptionHandler 사용: @ControllerAdvice에서 @ExceptionHandlerUnexpectedRollbackException을 처리하는 코드 작성은 운동장 정책이긴 하지만, 실제 예외 발생 상황과 프로젝트의 로깅 및 에러 처리 정책에 따라 다릅니다. 트랜잭션 오류를 보다 명확히 이해하기 위해 로깅 또는 알림 시스템을 설정하는 것도 좋습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

RepositoryTest의 패키지 위치가 domain인 이유

0

30

2

REQUIRES_NEW 해결 방법에 대해서 질문있습니다!!

0

30

1

update()에 사용하는 setter 질문드립니다.

0

47

1

SQL 중심적 개발의 문제점에 대한 질문

0

72

1

혹시 Containing 을 안쓰신 이유가 있을까요?

0

84

2

[공유] 스프링부트 4.x 버전 mybatis 연동

0

174

1

@repository 어노테이션

0

89

3

ItemService

0

58

1

논리 커밋, 물리 커밋 질문드립니다.

0

54

1

내부 트랜잭션 커밋은 필수인가요?

0

57

1

프록시 커넥션 객체를 반환할 때 생성하는건가요?

0

54

1

Transaction readOnly 성능 개선 (김영한님의 대한 감사인사)

2

178

2

JPQL 대신 네이티브 쿼리를 사용해야 하는 경우

0

77

1

@EventListener(ApplicationReadyEvent.class) 관련

0

88

1

트랜잭션 동기화 매니저와 데이터 소스

0

76

1

DB 관련 강의 개설 계획은 없으신건가요?

0

133

2

물리 트랜잭션 과 논리트랜잭션 용어를 맞게 이해한걸까요

0

94

1

스프링 3 버전 이상 rollbackFor 변경된듯요

1

112

1

트랜잭션 전파 질문.

0

87

1

프로젝트 오픈 에러

0

126

1

외부 트랜잭션에서 isNewTransaction이 false로 나오는거에 대해 질문드립니다

0

83

2

같은 스레드를 사용하면 트랜잭션 동기화 매니저는 같은 커넥션을 반환

0

72

1

h2 인메모리 테스트중 예약어 충돌날 경우 대처방법

0

102

1

커스텀aop와 트랜잭션을 같이 사용할때 우선순위에 관한 질문

0

98

2