작성
·
38
·
수정됨
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)
코드는 필요 없는 것 아닌가요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. yoon6669님.
질문하신 내용은 스프링의 트랜잭션 전파(Propagation)에 관한 부분으로, 외부 트랜잭션과 그 내부에서 사용되는 논리 트랜잭션(내부 트랜잭션)의 처리 방식에 대한 것입니다.
내부 트랜잭션이 “아무것도 하지 않는다”는 설명은, 논리 트랜잭션이기 때문에 물리 트랜잭션을 직접적으로 커밋하거나 롤백하지 않는다는 의미입니다. 즉, 실제 데이터베이스에 변경 사항을 적용하는 커밋이나 롤백은 물리 트랜잭션(여기서는 외부 트랜잭션)의 책임입니다.
그렇다면 inner.commit();
호출이 필요 없는 것이 아닌가라는 의문이 들 수 있습니다. 하지만 내부 트랜잭션의 commit()
메서드 호출은 논리적으로 그 트랜잭션 블록이 정상적으로 종료됨을 표시하는 기능을 합니다. 즉, 스프링 컨텍스트나 트랜잭션 관리자의 입장에서 내부적으로 관리할 필요가 있는 상태나 흐름에 대한 처리를 매끄럽게 해주는 역할을 하게 됩니다. 따라서 코드의 명시적 표현이나 시스템의 일관성을 위해 내부 트랜잭션에도 commit()
을 호출해 주는 것이 권장됩니다.
좀 더 구체적인 설명이나 예제를 원하신다면, 스프링 트랜잭션 전파와 관련된 다른 유익한 게시물을 참고하시면 좋을 것 같습니다. 예를 들어, 외부 내부 모두 신규 트랜잭션인데, 외부커넥션을 먼저 반납하는경우 또는 내부 트랜잭션 REQUIRES_NEW 질문입니다. 링크를 참조하면 이해를 더 깊게 할 수 있을 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.