inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 DB 2편 - 데이터 접근 활용 기술

스프링 트랜잭션 전파4 - 전파 예제

트랜잭션 전파 질문.

86

yoon6669

작성한 질문수 90

0

 두가지 질문 있습니다.

 

1) 16분 30초부터 설명하는 내부 트랜잭션 응답 흐름에서 궁금한점이 있습니다.

이번 강의에서 내부 트랜잭션이 참여하게 되면 이것은 아무것도 하지 않는 것이다라고 하셨고

내부 트랜잭션이 커밋해도 신규 트랜잭션이 아니기 때문에 실제 커밋을 호출하지 않는다.
그리고 실제 커넥션에 커밋이나 롤백을 호출하면 트랜잭션을 끝나기 때문에 안되기 때문에 실제 커밋을 호출하면 안되고 여기서는 아무것도 안한다 라고 설명하시는데요.
그렇다면 다음 코드에서

@Test
    void inner_commit() {
        log.info("외부 트랜잭션 시작");
        TransactionStatus outer = txManager.getTransaction(new DefaultTransactionAttribute());
        log.info("outer.isNewTransaction()={}", outer.isNewTransaction());

        log.info("내부 트랜잭션 시작");
        TransactionStatus inner = txManager.getTransaction(new DefaultTransactionAttribute());
        log.info("inner.isNewTransaction()={}", inner.isNewTransaction());
        log.info("내부 트랜잭션 커밋");
//        txManager.commit(inner);

        log.info("외부 트랜잭션 커밋");
        txManager.commit(outer);
    }

내부 트랜잭션에서 실제 커밋을 호출하면 안되고 어차피 아무것도 하지 않는 것이라면 없어도 되는 코드 아닌가? 라고 생각했는데

 

아래 다른 분이 하신 비슷한 질문의 답변에서

 

내부 트랜잭션을 사용한다고 결정했다면 항상 내부 트랜잭션을 커밋이나 롤백을 결정하셔야 합니다.

 

라고 답변 하신 것을 보았는데요. 아무것도 하지 않는데 내부 트랜잭션은 왜 커밋을 해주어야하는건가요?

 

2) 1번 질문이랑 관련 있는 것 같기는한데요.

이전 강의에서 모든 논리 트랜잭션이 커밋되어야 물리 트랜잭션이 커밋된다고 하셨는데요, 이번 강의에서나 다음 강의에서나 외부(물리) 트랜잭션만 커밋해도 실제 커넥션에 모두 커밋되는 것 같은데.. 아닌가요? 이것이 맞다면 1번 질문과 마찬가지로 외부 (물리) 트랜잭션만 하면 되니 txManager.commit(inner) 코드는 필요 없는 것 아닌가요?

spring mvc jpa querydsl spring-data-mybatis spring-jpa

답변 1

0

인프런 AI 인턴

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

질문하신 내용은 스프링의 트랜잭션 전파(Propagation)에 관한 부분으로, 외부 트랜잭션과 그 내부에서 사용되는 논리 트랜잭션(내부 트랜잭션)의 처리 방식에 대한 것입니다.

내부 트랜잭션이 “아무것도 하지 않는다”는 설명은, 논리 트랜잭션이기 때문에 물리 트랜잭션을 직접적으로 커밋하거나 롤백하지 않는다는 의미입니다. 즉, 실제 데이터베이스에 변경 사항을 적용하는 커밋이나 롤백은 물리 트랜잭션(여기서는 외부 트랜잭션)의 책임입니다.

그렇다면 inner.commit(); 호출이 필요 없는 것이 아닌가라는 의문이 들 수 있습니다. 하지만 내부 트랜잭션의 commit() 메서드 호출은 논리적으로 그 트랜잭션 블록이 정상적으로 종료됨을 표시하는 기능을 합니다. 즉, 스프링 컨텍스트나 트랜잭션 관리자의 입장에서 내부적으로 관리할 필요가 있는 상태나 흐름에 대한 처리를 매끄럽게 해주는 역할을 하게 됩니다. 따라서 코드의 명시적 표현이나 시스템의 일관성을 위해 내부 트랜잭션에도 commit()을 호출해 주는 것이 권장됩니다.

좀 더 구체적인 설명이나 예제를 원하신다면, 스프링 트랜잭션 전파와 관련된 다른 유익한 게시물을 참고하시면 좋을 것 같습니다. 예를 들어, 외부 내부 모두 신규 트랜잭션인데, 외부커넥션을 먼저 반납하는경우 또는 내부 트랜잭션 REQUIRES_NEW 질문입니다. 링크를 참조하면 이해를 더 깊게 할 수 있을 것입니다.

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

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

0

13

1

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

0

25

1

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

0

43

1

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

0

70

1

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

0

80

2

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

0

168

1

@repository 어노테이션

0

88

3

ItemService

0

55

1

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

0

52

1

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

0

55

1

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

0

52

1

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

2

175

2

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

0

76

1

@EventListener(ApplicationReadyEvent.class) 관련

0

86

1

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

0

74

1

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

0

132

2

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

0

92

1

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

1

109

1

프로젝트 오픈 에러

0

124

1

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

0

82

2

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

0

70

1

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

0

99

1

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

0

94

2

아이솔레이션 레벨에 관한 내용도

0

69

1