스프링/5. 스프링 DB-1

24. 트랜잭션 동기화

sdafdq 2023. 9. 30. 14:20

스프링이 제공하는 트랜잭션 매니저( PlatformTransactionManager )는 크게 2가지 역할을 한다.

트랜잭션 추상화

리소스 동기화

 

트랜잭션 추상화는 직전에 말 했고,

 

리소스 동기화

트랜잭션을 유지하려면 트랜잭션의 시작부터 끝까지 같은 커넥션(DB세션)을 유지해야 한다.

이전에는 그걸 파라미터로 줬다.

 

하지만 스프링이 제공하는 트랜잭션 매니저는

이런 식이다.

트랜잭션 매니저 내부에는 트랜잭션 동기화 매니저가 있다.

트랜잭션 할 때는 커넥션을 쓰레드 로컬에 저장해 놓는데,

쓰레드 로컬이란 그 쓰레드만 접근할 수 있는 저장소이다. 

트랜잭션 동기화 매니저가 쓰레드 로컬에 저장해 놓는 것이다.

 

그래서 커넥션이 필요하면 저 로컬쓰레드에 있는 커넥션을 획득하면 되서, 이전처럼 파라미터로 커넥션을 전달 할 필요가 없다.

 

아마 커넥션 시작부터 커넥션을 로컬쓰레드에 저장시켜놨다가, 커넥션이 풀에 반환되면 로컬쓰레드에서도 삭제가 되는(더이상 참조하지 않는)  그런 느낌일 듯.

 

동작 방식은

1. 트랜잭션 매니저는 DataSource를 통해 커넥션을 얻는다. 그 후 트랜잭션을 시작한다.

2. 트랜잭션 매니저는 트랜잭션이 시작된 커넥션을 트랜잭션 동기화 매니저 (쓰레드로컬) 에 보관한다.

3. 리포지토리는 트랜잭션 동기화 매니저(쓰레드로컬)에 보관된 커넥션을 꺼내 사용한다.

4. 비즈니스로직에서 commit이나 rollback등을 호출하여 트랜잭션을 종료하게 되면, 트랜잭션 동기화 매니저에 담겨있는 커넥션을 통해 commit 또는 rollback을 하고, 커넥션을 닫고(반환해 주고), 트랜잭션 동기화 매니저에 저장된 커넥션도 지워준다.

 

public abstract class TransactionSynchronizationManager {

	private static final ThreadLocal<Map<Object, Object>> resources =
			new NamedThreadLocal<>("Transactional resources");

	private static final ThreadLocal<Set<TransactionSynchronization>> synchronizations =
			new NamedThreadLocal<>("Transaction synchronizations");

	private static final ThreadLocal<String> currentTransactionName =
			new NamedThreadLocal<>("Current transaction name");

	private static final ThreadLocal<Boolean> currentTransactionReadOnly =
			new NamedThreadLocal<>("Current transaction read-only status");

	private static final ThreadLocal<Integer> currentTransactionIsolationLevel =
			new NamedThreadLocal<>("Current transaction isolation level");

	private static final ThreadLocal<Boolean> actualTransactionActive =
			new NamedThreadLocal<>("Actual transaction active");

실제 트랜잭션 동기화 매니저의 추상클래스의 일부분인데,

저렇게 트랜잭션 관련 정보 및 여러가지를 쓰레드 로컬에 저장시켜 놓는다. 

 

 

'스프링 > 5. 스프링 DB-1' 카테고리의 다른 글

26. 트랜잭션 템플릿  (0) 2023.10.01
25. 트랜잭션 매니저  (0) 2023.10.01
23. 트랜잭션 추상화  (0) 2023.09.30
22. 기존 트랜잭션의 문제  (0) 2023.09.30
21. 이체 트랜잭션 적용  (0) 2023.09.30