인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

kongminoo님의 프로필 이미지
kongminoo

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

정리

제대로 이해했는지 확인하고싶습니다.

작성

·

75

0

image.png

가장 처음에 했던 트랜잭션은 각각의 리포지터리에서 @Transactional을 걸어줘서 별도로 커밋, 롤백 되게끔 만들었습니다.

 

image.png

이후, 마지막에는 LogRepository에 @Transactional(propagation = Propagation.REQUIRES_NEW)를 사용해서 트랜잭션 동기화 매니저에서 다른 커넥션을 가져와서 별도로 커밋, 롤백 되게끔 만들었습니다.

 

여기서 궁금한 점은 처음과 마지막의 트랜잭션의 구성은 다르지만 결과값은 똑같은 게 맞을까요?

 

다른 점이 있다면 혹시 무엇인지 알려주시면 감사하겠습니다.

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. kongminoo님

AI 인턴이 잘 답변해주었는데요.

여기에 더해서 설명을 드리자면, 처음 예제와 마지막 예제는 트랜잭션의 범위가 다릅니다.

처음 예제는 MemberService에서 트랜잭션을 사용하지 않습니다. MemberService에서 예외가 발생해도 앞서 실행한 트랜잭션이 롤백되지 않습니다.

반면에 마지막 예제는 MemberService에서 트랜잭션을 사용합니다. 따라서 MemberService에서 런타임 예외가 발생하면 트랜잭션이 롤백됩니다.

감사합니다.

0

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

질문하신 내용에 대해 설명드리겠습니다.

처음에 각 리포지터리에 @Transactional을 사용하여 별도로 커밋, 롤백하게 구성하신 것과, 마지막에 LogRepository@Transactional(propagation = Propagation.REQUIRES_NEW)를 사용하여 별도로 커밋, 롤백하게 구성하신 경우는 결과적으로 커밋과 롤백이 따로 관리된다는 점에서 비슷하지만, 동작 방식에는 차이가 있습니다.

  1. 처음 구성 (@Transactional 사용):

    • 각 트랜잭션은 독립적으로 관리됩니다. MemberRepositoryLogRepository 각각이 자신의 트랜잭션 매니저에 의해 관리되며, 별도의 연결을 사용하여 커밋되거나 롤백됩니다.
    • 이 경우, 하나의 트랜잭션이 실패해도 다른 트랜잭션에 영향을 미치지 않습니다.
  2. 마지막 구성 (@Transactional(propagation = Propagation.REQUIRES_NEW) 사용):

    • Propagation.REQUIRES_NEW를 사용하면, 현재 실행 중인 트랜잭션을 잠시 중단하고, 새로운 트랜잭션을 시작합니다.
    • LogRepository에서 실행되는 트랜잭션은 기존의 MemberServiceMemberRepository의 트랜잭션과 분리되어, 별도의 커밋과 롤백 과정을 거칩니다.
    • 만약 MemberService와 연관된 트랜잭션에서 문제가 발생하여 롤백되더라도, LogRepository의 트랜잭션은 REQUIRES_NEW로 인해 독립적으로 커밋되므로 영향을 받지 않습니다.

따라서, 두 구성은 겉보기에는 비슷하게 보일 수 있지만, Propagation.REQUIRES_NEW를 사용한 경우는 이미 존재하는 트랜잭션과는 완전히 독립적인 새로운 트랜잭션을 생성한다는 차이가 있습니다. 이로 인해 트랜잭션 경계와 롤백/커밋의 방식에 차이가 있을 수 있습니다.

도움이 되셨기를 바랍니다. 추가 질문이 있다면 언제든지 말씀해 주세요! 😊

이미지 출처: 인프런

kongminoo님의 프로필 이미지
kongminoo

작성한 질문수

질문하기