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