외부 트랜잭션에서 isNewTransaction이 false로 나오는거에 대해 질문드립니다
@SpringBootTest
class MemberServiceTest {
@Autoworied lateinit var memberService: MembersService
@Test
fun get() {
memberService.get(1L)
}
}@Service
class MemberService(
private val txManager: PlatformTransactionManager,
) {
@Transactional(readOnly = true)
fun get(id: Long) {
val tx = txManager.getTransaction(DefaultTransactionAttribute())
println("isCurrentTransactionReadOnly()=${TransactionSynchronizationManager.isCurrentTransactionReadOnly()}")
println("isActualTransactionActive()=${TransactionSynchronizationManager.isActualTransactionActive()}")
println("isNewTransaction()=${tx.isNewTransaction()}")
// get
}
}
제가 기대한건
isNewTransaction = true
인데요 -> 가장 처음 호출된 @Transactional이 있는 service 메서드이기 때문에
그런데
테스트 코드로 실행해도 그렇고, API로 get 메서드가 호출되도록 해봐도 그렇고
모두 isNewTransaction = false 로 나옵니다.
내부 트랜잭션이 아니라 외부 트랜잭션이라고 생각했는데 왜 false일까요....
09:54:40.059 [Test worker] DEBUG o.s.o.j.JpaTransactionManager - Creating new transaction with name [com.application.service.member.MemberService.get]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly
09:54:40.062 [Test worker] DEBUG o.s.o.j.JpaTransactionManager - Opened new EntityManager [SessionImpl(16208286<open>)] for JPA transaction
09:54:40.075 [Test worker] DEBUG o.h.e.t.i.TransactionImpl - On TransactionImpl creation, JpaCompliance#isJpaTransactionComplianceEnabled == false
09:54:40.075 [Test worker] DEBUG o.h.e.t.i.TransactionImpl - begin
09:54:40.081 [Test worker] DEBUG o.s.o.j.JpaTransactionManager - Exposing JPA transaction as JDBC [org.springframework.orm.jpa.member.HibernateJpaDialect$HibernateConnectionHandle@486e4af6]
09:54:40.083 [Test worker] TRACE o.s.t.i.TransactionInterceptor - Getting transaction for [com.application.service.member.MemberService.get]
09:54:40.084 [Test worker] DEBUG o.s.o.j.JpaTransactionManager - Found thread-bound EntityManager [SessionImpl(16208286<open>)] for JPA transaction
09:54:40.084 [Test worker] DEBUG o.s.o.j.JpaTransactionManager - Participating in existing transaction
TransactionSynchronizationManager.isCurrentTransactionReadOnly()=true
TransactionSynchronizationManager.isActualTransactionActive()=true
outer.isNewTransaction()=falseCreating new transaction with name이 나오는데
09:54:40.084 [Test worker] DEBUG o.s.o.j.JpaTransactionManager - Participating in existing transaction 이 로그도 나옵니다,,
답변 2
0
안녕하세요, 인프런 AI 인턴입니다. 또또록님.
스프링에서의 트랜잭션 전파와 관련하여 질문해 주신 내용에 대해 설명드리겠습니다.
@Transactional을 통해 메서드를 감쌀 때, 스프링은 해당 메서드가 실행될 때마다 새로운 트랜잭션을 시작하지 않습니다. 기본적으로 스프링의 트랜잭션 전파는 PROPAGATION_REQUIRED로 설정되어 있습니다. 이는 이미 실행 중인 트랜잭션이 있으면 현재 트랜잭션에 참여하고, 없으면 새 트랜잭션을 시작하는 동작입니다.
따라서, memberService.get(1L) 메서드가 @Transactional(readOnly = true)로 정의되어 있었을 때, 스프링은 트랜잭션이 이미 존재한다고 판단하여 현재 트랜잭션을 사용하게 됩니다. txManager.getTransaction(DefaultTransactionAttribute())로부터 가져온 트랜잭션 객체는 이미 존재하는 트랜잭션에 참여하게 되며, 이는 isNewTransaction()이 false로 나타나는 이유입니다.
테스트 환경이나 API 호출에서 동일한 현상이 발생하는 것은 테스트 또는 웹 요청 컨텍스트에서 이미 트랜잭션이 시작되어 있기 때문일 가능성이 높습니다.
관련해서 더 깊이 있는 자료를 원하신다면, 아래의 내용을 참고할 수 있습니다:
- 인프런 강의: 스프링 트랜잭션 전파에 대한 설명을 포함하는 스프링 DB 2편 - 데이터 접근 활용 기술 강의는 이 주제를 자세히 다루고 있습니다.
추가적인 질문이 있으시다면 언제든지 남겨주세요. 지식공유자께서도 곧 답변해 주실 것입니다. 😊
저는 질문자님의 이해를 돕고자 지식공유자의 기존 답변을 참고하여 유사한 답변 링크를 추천해드립니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
RepositoryTest의 패키지 위치가 domain인 이유
0
13
1
REQUIRES_NEW 해결 방법에 대해서 질문있습니다!!
0
25
1
update()에 사용하는 setter 질문드립니다.
0
43
1
SQL 중심적 개발의 문제점에 대한 질문
0
70
1
혹시 Containing 을 안쓰신 이유가 있을까요?
0
80
2
[공유] 스프링부트 4.x 버전 mybatis 연동
0
168
1
@repository 어노테이션
0
88
3
ItemService
0
55
1
논리 커밋, 물리 커밋 질문드립니다.
0
52
1
내부 트랜잭션 커밋은 필수인가요?
0
55
1
프록시 커넥션 객체를 반환할 때 생성하는건가요?
0
52
1
Transaction readOnly 성능 개선 (김영한님의 대한 감사인사)
2
175
2
JPQL 대신 네이티브 쿼리를 사용해야 하는 경우
0
76
1
@EventListener(ApplicationReadyEvent.class) 관련
0
86
1
트랜잭션 동기화 매니저와 데이터 소스
0
74
1
DB 관련 강의 개설 계획은 없으신건가요?
0
132
2
물리 트랜잭션 과 논리트랜잭션 용어를 맞게 이해한걸까요
0
92
1
스프링 3 버전 이상 rollbackFor 변경된듯요
1
109
1
트랜잭션 전파 질문.
0
86
1
프로젝트 오픈 에러
0
124
1
같은 스레드를 사용하면 트랜잭션 동기화 매니저는 같은 커넥션을 반환
0
70
1
h2 인메모리 테스트중 예약어 충돌날 경우 대처방법
0
99
1
커스텀aop와 트랜잭션을 같이 사용할때 우선순위에 관한 질문
0
94
2
아이솔레이션 레벨에 관한 내용도
0
69
1





