내부 트랜잭션 롤백시 마킹의 필요성
149
작성한 질문수 26
대원칙인 모든 논리 트랜잭션이 커밋되어야 모두가 커밋되는거고 하나라도 롤백되면 모두가 롤백된다는 개념에서 내부 트랜잭션이 롤백되면 그 시점에 모두 롤백시키면 되지 않나요? 굳이 내부 트랜잭션 롤백 후 물리 트랜잭션에 rollback_only마크를 달아 결국 모두가 롤백되도록 하는 이유가 궁금합니다.
또 궁금한 점은 만약 개발자가 실수로 외부 트랜잭션을 먼저 롤백해버린다면 -> 제가 실험해보니 외부 트랜잭션 롤백시 물리 트랜잭션이 즉각 롤백이 되더라구요. 아마 isNewTransaction이 트루인 경우니 최종 결정권자의 형태로 바로 롤백을 시키는 것 같은데 그러고 나서 내부 트랜잭션 롤백을 시도하니까 여전히 롤백 마크를 남기는 로그가 뜨더라구요. 이 점에 대해서 설명 부탁드립니다:)
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
영한노게임님의 질문에 대해, 스프링 트랜잭션 관리와 관련된 깊은 이해가 요구되는 주제입니다. 우선, 내부 트랜잭션 롤백에 대한 처리 과정과 외부 트랜잭션에 rollback_only 마크를 달아두는 이유에 대해서는, 스프링 트랜잭션 관리 메커니즘의 근간을 이루는 일관성과 데이터 무결성 확보를 위함입니다.
트랜잭션의 전파(propagation) 특성에 따라 하나의 물리적 트랜잭션 내에서 여러 개의 논리 트랜잭션(내부 트랜잭션)이 수행될 수 있습니다. 여기서 하나의 내부 트랜잭션이 실패하여 롤백을 요청하는 경우, 해당 트랜잭션이 포함된 전체 트랜잭션(물리 트랜잭션)에 영향을 줄 수 있게 하기 위해 rollback_only 마킹이 필요합니다. 이는 나머지 작업들이 성공적으로 수행되었다 하더라도, 전체 작업의 일관성을 유지하기 위해 결국 전체 트랜잭션을 롤백시키겠다는 의미입니다.
외부 트랜잭션을 먼저 롤백하는 경우 Immediate 롤백이 발생하는 것과 관련해서, 실제로 외부 트랜잭션에 의한 롤백 요청이 발생하면, 해당 트랜잭션 연결에 대한 롤백 처리가 즉각적으로 이루어지며, 이후에 진행되는 모든 내부 트랜잭션 롤백 시도에 대해서는 이미 롤백된 트랜잭션 상태에서 어떤 작업도 수행할 수 없음에도, 시스템의 일관성을 위해 롤백 마킹이 로깅되는 것입니다. 이는 시스템이 예상치 못한 상황에서도 최대한 일관된 상태를 유지하려는 스프링 프레임워크의 설계 철학을 반영한 것이라고 볼 수 있습니다.
영한노게임님의 질문과 유사한 사례를 다뤄주는 몇 가지 기존 답변을 참고하실 것을 권장드립니다. 트랜잭션 전파 및 롤백 처리에 관한 깊이 있는 이해를 돕고자, 다음 링크들을 제공합니다:
- 트랜잭션 전파 관련 질문 있습니다: 내부 트랜잭션에서 롤백을 하고 외부 트랜잭션에서 커밋이 이루어지는 경우의 예외 처리에 대한 설명입니다.
- 스프링 트랜잭션 전파 - REQUIRES_NEW 에 궁금한 점: REQUIRES_NEW 옵션을 사용할 때, 트랜잭션 간 영향에 대한 구체적인 설명과 예제 코드를 포함합니다.
이러한 질문과 답변을 통해 트랜잭션 처리의 복잡한 상황들을 이해하는 데 도움이 되길 바랍니다.
저는 영한노게임님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
RepositoryTest의 패키지 위치가 domain인 이유
0
30
2
REQUIRES_NEW 해결 방법에 대해서 질문있습니다!!
0
30
1
update()에 사용하는 setter 질문드립니다.
0
47
1
SQL 중심적 개발의 문제점에 대한 질문
0
72
1
혹시 Containing 을 안쓰신 이유가 있을까요?
0
83
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





