작성
·
66
0
가장 처음에 했던 트랜잭션은 각각의 리포지터리에서 @Transactional을 걸어줘서 별도로 커밋, 롤백 되게끔 만들었습니다.
이후, 마지막에는 LogRepository에 @Transactional(propagation = Propagation.REQUIRES_NEW)를 사용해서 트랜잭션 동기화 매니저에서 다른 커넥션을 가져와서 별도로 커밋, 롤백 되게끔 만들었습니다.
여기서 궁금한 점은 처음과 마지막의 트랜잭션의 구성은 다르지만 결과값은 똑같은 게 맞을까요?
다른 점이 있다면 혹시 무엇인지 알려주시면 감사하겠습니다.
답변 2
0
안녕하세요. kongminoo님
AI 인턴이 잘 답변해주었는데요.
여기에 더해서 설명을 드리자면, 처음 예제와 마지막 예제는 트랜잭션의 범위가 다릅니다.
처음 예제는 MemberService에서 트랜잭션을 사용하지 않습니다. MemberService에서 예외가 발생해도 앞서 실행한 트랜잭션이 롤백되지 않습니다.
반면에 마지막 예제는 MemberService에서 트랜잭션을 사용합니다. 따라서 MemberService에서 런타임 예외가 발생하면 트랜잭션이 롤백됩니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. kongminoo님.
질문하신 내용에 대해 설명드리겠습니다.
처음에 각 리포지터리에 @Transactional
을 사용하여 별도로 커밋, 롤백하게 구성하신 것과, 마지막에 LogRepository
에 @Transactional(propagation = Propagation.REQUIRES_NEW)
를 사용하여 별도로 커밋, 롤백하게 구성하신 경우는 결과적으로 커밋과 롤백이 따로 관리된다는 점에서 비슷하지만, 동작 방식에는 차이가 있습니다.
처음 구성 (@Transactional
사용):
MemberRepository
와 LogRepository
각각이 자신의 트랜잭션 매니저에 의해 관리되며, 별도의 연결을 사용하여 커밋되거나 롤백됩니다.마지막 구성 (@Transactional(propagation = Propagation.REQUIRES_NEW)
사용):
Propagation.REQUIRES_NEW
를 사용하면, 현재 실행 중인 트랜잭션을 잠시 중단하고, 새로운 트랜잭션을 시작합니다.LogRepository
에서 실행되는 트랜잭션은 기존의 MemberService
와 MemberRepository
의 트랜잭션과 분리되어, 별도의 커밋과 롤백 과정을 거칩니다.MemberService
와 연관된 트랜잭션에서 문제가 발생하여 롤백되더라도, LogRepository
의 트랜잭션은 REQUIRES_NEW
로 인해 독립적으로 커밋되므로 영향을 받지 않습니다.따라서, 두 구성은 겉보기에는 비슷하게 보일 수 있지만, Propagation.REQUIRES_NEW
를 사용한 경우는 이미 존재하는 트랜잭션과는 완전히 독립적인 새로운 트랜잭션을 생성한다는 차이가 있습니다. 이로 인해 트랜잭션 경계와 롤백/커밋의 방식에 차이가 있을 수 있습니다.
도움이 되셨기를 바랍니다. 추가 질문이 있다면 언제든지 말씀해 주세요! 😊