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

blackhole124님의 프로필 이미지
blackhole124

작성한 질문수

스프링 DB 1편 - 데이터 접근 핵심 원리

트랜잭션 문제 해결 - 트랜잭션 매니저1

DataSourceUtils.getConnection() 질문 있습니다.

작성

·

368

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
스크린샷 2023-09-04 오후 8.37.53.png스크린샷 2023-09-04 오후 8.38.00.png강사님께서 설명하신 내용 중에

DataSourceUtils.getConnection()는 트랙잭션 동기화 매니저에서 관리하는 커넥션이 있으면 해당 커넥션을 반환한다고 말씀하셨습니다.

근데 여기서 제가 궁금한 부분은

어떤 커넥션인지 구분하는 부분이 없는데 어떻게 구별해서 커넥션을 반환하는 건가요?

예를 들어, A통장에 대한 트랙잭션을 시작한 뒤에

A통장 커넥션이 트랙잭션 동기화 매니저에 존재할 때,

동시에 B 통장도 트랙잭션을 시작하고

B 통장의 커넥션이 트랙잭션 동기화 매니저에 존재하는 상황에서

데이터 접근 로직에서 트랙잰션 매니저에 접근해서 커넥션을 가져오는 과정에서 어떻게 A 커넥션, B 커넥션을 구분해서 반환하는 건가요??

설명 부탁드립니다.

답변 1

2

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

질문을 듣고 좀 더 정확하게 답변을 드리고 싶어 DataSourceUtils의 getConnection() 부터 코드를 타고 들어가 봤습니다.

image

DataSourceUtils의 getConnection()에서 호출하는 doGetConnection()을 들어가보면 내부에서 TransactionSynchronizationManager.getResource()를 이용해서 트랜잭션 리소스를 불러오는 것을 볼 수 있습니다! 해당 메서드를 찾아 보겠습니다.

image

위가 TransactionSynchronizationManager 의 getResource()와 내부 호출하는 doGetResource()의 구현 코드입니다. resources 라는 필드에서 값을 가져오는 것으로 보입니다. resources 라는 필드를 보겠습니다.

image

TransactionSynchronizationManager은 필드들을 전부 ThreadLocal 을 사용해서 관리하고 있는 것을 알 수 있습니다.

이를 바탕으로 질문해주신 것에 대해 대답을 드리자면, 트랜잭션 리소스는 쓰레드별로 생기게 됩니다. 예를 들어 A통장의 이체 요청이 A쓰레드, B통장의 이체 요청이 B쓰레드라고 하면, 트랜잭션들은 각각 쓰레드별로 생겨 각 쓰레드로컬 저장소에 저장됩니다. 그 후 트랜잭션 동기화 매니저에서는 쓰레드별로 저장되어있는 트랜잭션 리소스를 주는 것으로 이해할 수 있습니다.

 

감사합니다.

blackhole124님의 프로필 이미지
blackhole124

작성한 질문수

질문하기