SSAFY11th-book-study / book-study

0 stars 0 forks source link

[5.2.3] 트랜잭션 동기화 #47

Open a-young-kim opened 4 months ago

a-young-kim commented 4 months ago

image

image

트랜잭션 동기화의 작동 방식에 대해 잘 모르겠어서 질문 드립니다. 제가 이해한 바는 다음과 같습니다.

  1. 트랜잭션 동기화 관리자 초기화 -> 이 메소드는 어떠한 역할을 할까요?
  2. connection 생성 후 트랜잭션 동기화 관리자에 자동 저장
  3. dao의 메소드 호출 시 트랜잭션 동기화 저장소에 현재 시작된 트랜잭션을 가진 Connection 오브젝트 존재 확인 -> connection 오브젝트가 두 개 이상 존재할 수도 있을까요?? 있다면 해당 오브젝트가 현재 오브젝트인지는 어떤 방식으로 판단할까요?
  4. sql 문 실행
  5. 모든 dao 메소드가 잘 실행되었으면 commit, 오류가 있으면 rollback4
sootudio commented 4 months ago

제가 찾아본 내용을 바탕으로 정리하면

  1. 트랜잭션 동기화 관리자 초기화 메소드는 어떠한 역할을 할까요? 트랜잭션 동기화 관리자 초기화는 스프링에서 트랜잭션을 관리하기 위해 필요한 환경을 설정하는 과정이라고 합니다. 자세한 설명은... 쓰려고 했으나 시간이 부족합니다..

  2. connection 오브젝트가 두 개 이상 존재할 수도 있을까요?? 있다면 해당 오브젝트가 현재 오브젝트인지는 어떤 방식으로 판단할까요?

시간이 없어서 gpt 답변 가져옵니다... 미안해유 트랜잭션 동기화 관리자가 활성화되면, 트랜잭션 동기화 저장소(Transaction Synchronization Store)라는 곳에 현재 트랜잭션에 대한 정보가 저장됩니다. 이 정보에는 현재 트랜잭션과 관련된 Connection 오브젝트의 참조가 포함됩니다. 이 때 여러 개의 Connection 오브젝트가 존재할 수 있는데, 이는 주로 분산 트랜잭션과 같이 여러 개의 데이터 소스를 다루거나, 다수의 DAO가 동시에 작동하는 경우에 발생할 수 있습니다.

트랜잭션 동기화 저장소는 스레드 로컬 변수(ThreadLocal)를 사용하여 각 스레드마다 독립적으로 관리됩니다. 따라서 한 스레드에서 특정 시점에 여러 개의 트랜잭션을 동시에 처리하더라도, 각 트랜잭션에 해당하는 Connection 오브젝트를 구분하여 저장할 수 있습니다.

특정 Connection 오브젝트가 현재 트랜잭션에 속하는지 여부를 판단하기 위해서는 다음과 같은 방법을 사용할 수 있습니다:

스레드 로컬 변수를 통한 접근: 트랜잭션 동기화 저장소에 접근하여 현재 스레드의 트랜잭션과 관련된 Connection 오브젝트를 확인할 수 있습니다. 각 스레드는 자신만의 트랜잭션 동기화 저장소를 가지고 있으므로, 스레드마다 별도의 Connection 오브젝트가 관리됩니다.

트랜잭션 매니저를 통한 접근: 일반적으로 스프링의 트랜잭션 매니저를 통해 Connection을 관리합니다. 트랜잭션 매니저를 통해 현재 트랜잭션에 속한 Connection을 가져올 수 있습니다. 이를 통해 현재 트랜잭션과 관련된 Connection 오브젝트를 식별할 수 있습니다.

위의 두 가지 방법을 통해 스프링은 여러 개의 Connection 오브젝트를 관리하면서도 현재 트랜잭션에 속한 Connection을 신속하게 식별하여 사용할 수 있습니다.

a-young-kim commented 4 months ago
  1. 스레드당 set 생성 2.중첩 트랜잭션, 트랜잭션 전파