인프런 커뮤니티 질문&답변
내부 트랜잭션 커밋은 필수인가요?
작성
·
15
·
수정됨
0
log.info("내부 트랜잭션 커밋");
txManager.commit(inner);
log.info("외부 트랜잭션 커밋");
txManager.commit(outer);전체 커밋하는 상황에서 내부, 외부 모두 커밋이 되어야 실제 물리 커밋이 이루어진다고 앞서 개념을 설명하실 때도 그렇고 이번 강의에서도 설명하셨습니다.
그런데 내부 커밋을 진행하면 아무 일도 발생하지 않고 외부 트랜잭션에서 커밋을 진행해야 실제 물리 커밋이 되는데
그렇다면 이때 내부 커밋을 진행하지 않아도 되나요? 아니면 모두 커밋돼야 커밋된다는 원칙에 따라 내부 커밋도 필수적으로 진행하여야하고 외부 커밋도 진행하여야하는 것인가요?
제 생각에는 정말 내부 커밋이 필요하다면 호출이 반드시 필요하다라고 설명하셨을 것 같은데 내부 커밋을 해도 아무것도 안한다고 하시니 내부 커밋 코드를 호출에 의문점이 생깁니다.
실제 물리 커밋은 외부 커밋에서 진행되기 때문에 내부 커밋 코드를 강의 설명 차원에서 작성하신 것인지 아니면 정말 원칙에 따라 필요해서 호출한 것인지 궁금합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. yoon6669님.
스프링 트랜잭션 관리는 내부적으로 논리적 트랜잭션과 물리적 트랜잭션을 명확히 구분합니다. 질문하신 내용에서 사용하고 계시는 내부 트랜잭션 txManager.commit(inner)는 스프링이 관리하고 있는 논리적 트랜잭션베이스에 영향을 주지만, 실제 데이터베이스에 대한 물리적인 변경은 이루어지지 않습니다. 물리적 커밋은 보통 외부 트랜잭션인 txManager.commit(outer)에서 이루어지게 됩니다.
내부 트랜잭션 커밋이 의미하는 것은 스프링이 내부적으로 이 트랜잭션이 정상적으로 완료되었음을 관리하는 것일 뿐, 실제 데이터베이스가 이 상태를 가지고 어떤 동작을 수행하는 것은 아닙니다. 그렇기에 internal commit이라는 코드는 트랜잭션 전파에 따라 올바르게 코드가 구성되었는지를 보장하기 위해 사용됩니다.
하지만 실질적으로 직접적으로 물리적 커밋은 외부 커밋에서 이루어지고, 내부 커밋은 트랜잭션 전파 상태 유지를 할 수 있도록 호출됩니다. 이러한 호출은 운영체제가 아닌 트랜잭션 매니저가 이 트랜잭션이 내부적으로 논리적 단위로 처리되었음을 알려주기 위한 용도가 있습니다.
유사한 질문과 답변을 볼 수 있는 링크를 아래에 소개드리겠습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






올바르게 코드가 구성되었는지를 보장하기 위해 사용되는 것이라면 필수적으로 호출해야하는건가요