인프런 커뮤니티 질문&답변

Jaesang Yoon님의 프로필 이미지

작성한 질문수

실전! 스프링 데이터 JPA

스프링 데이터 JPA 구현체 분석

트랜젝션 옵션의 전파에 대해 질문드립니다.

작성

·

149

·

수정됨

0

예전에 영한님이 답변하신 내용 중에

스프링이 제공하는 트랜잭션은 처음 시작한 트랜잭션을 기반으로 전파됩니다.

그러니까 서비스에서 트랜잭션을 시작하면 리포지토리의 트랜잭션이 해당 트랜잭션을 그대로 이어 받습니다.

라는 내용이 있었습니다.

그렇다면, 컨트롤러, 서비스, 리포지토리 순으로 코드가 진행된다고 할 때, 만약 서비스 계층에 @Trasnactional(readonly=false)가 걸려있고 리포지토리 계층에 @Trasnactional(readonly=true)가 걸려있으면 서비스 계층이 먼저 호출되므로 readonly=false 옵션이 적용된 채로 리포지토리 계층까지(기존 리포지토리 계층의 옵션은 무시된채로) 코드가 흘러가는걸까요?

답변 2

0

안녕하세요. Jaesang Yoon님, 공식 서포터즈 y2gcoder입니다. 

AI 답변 링크의 영한님의 답변을 참고해주세요 🙂

감사합니다.

0

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

Jaesang Yoon님의 질문은 스프링의 트랜잭션 전파에 대한 이해와 관련하여, 서비스 계층과 리포지토리 계층에서 서로 다른 @Transactional 설정이 있을 때의 동작 원리를 질문하고 계십니다.

이러한 상황에서, 트랜잭션의 전파 방식을 이해하는 것이 중요합니다. 스프링 트랜잭션에서는 하나의 트랜잭션 범위 내에서 시작된 여러 작업들이 전파 방식에 따라 어떻게 처리되는지 정의합니다. 특히, 스프링에서는 @Transactional 어노테이션의 propagation 속성을 통해 트랜잭션의 전파 방식을 세밀하게 제어할 수 있습니다.

귀하의 질문과 밀접하게 관련되어, 영한님은 스프링이 제공하는 트랜잭션 초기에 시작하는 (처음 시작한 트랜잭션을 기반으로 전파되는) 방식에 대해 설명한 내용이 있습니다.

예를 들어, 서비스 계층에서 @Transactional(readOnly=false)를 설정하고, 리포지토리 계층에서 @Transactional(readOnly=true)를 설정했다면, 서비스 계층에서 시작된 트랜잭션 설정이 전파되어 리포지토리 계층까지 영향을 미칩니다. 즉, 서비스 계층에서 설정한 트랜잭션의 설정이 리포지토리 계층의 트랜잭션 설정을 덮어씌우게 됩니다. 이는 스프링 트랜잭션 관리의 기본 원리 중 하나입니다.

다음 URL의 답변에서 영한님이 “@Transaction에 대한 궁금중”에 답변한 내용이 이 문제에 대한 이해를 돕는 데 유용할 수 있습니다.

본 문제에 대해 위 링크에서는 서비스 계층에서 트랜잭션이 시작되면 이후의 모든 작업이 해당 트랜잭션에 의해 관리되며, 이후 레이어(예: 리포지토리)에서 정의한 트랜잭션 설정은 무시됨을 언급합니다.

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