개발지식 먹는 하마 님의 블로그

TSM (Transaction Synchronization Manager) 본문

개발 지식

TSM (Transaction Synchronization Manager)

devhippo 2025. 8. 17. 20:37

이전에 정리했던 글에서 트랜잭션 흐름과 추상화에 대해 설명할 때,
한 번 언급된 요소인 Transaction Manager에 관한 내용이다.

https://devhippo.tistory.com/158

 

Spring에서의 Transaction 트랜잭션 - 전파, 격리 수준 등

Transaction이란?데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 Transaction의 특징 + 관련 기능✅ 원자성 Atomicity + Commit & Rollback1개의 트랜잭션 내의 연산이 모

devhippo.tistory.com

 

PlatformTransactionManager

https://mangkyu.tistory.com/154

기술마다 사용하는 리소스가 다루기 때문에 트랜잭션 관리를 추상화한 것이 바로 PlatformTransactionManager이다.

DataSourceTransactionManager

DataSourceTransactionManager는 PlatformTransactionManager 구현체이다. = 트랜잭션 관리기
(사용 기술에 따라 이름이 조금씩 달라진다.)

TransactionSynchronizationManager란?

Spring에서 트랜잭션의 상태를 관리하고, 트랜잭션과 관련된 자원을 동기화하는 역할
  • ThreadLocal 기반 저장소
  • 트랜잭션 리소스 동기화와 콜백 관리
  • 트랜잭션 상태 추적 및 관리 가능

앞서 PlatformTransactionManager와 DataSourceTransactionManager에 대해 설명한 이유는
TransactionSynchronizationManager가 PlatformTransactionManager의 내부에서 사용되는 유틸리티이기 때문이다.

✅ 리소스 바인딩 

기술에 따라 다른 리소스를 현재 스레드에 바인딩한다
= 같은 트랜잭션 안에서 항상 동일한 리소스 사용 가능
//리소스를 현재 스레드에 바인딩
TransactionSynchronizationManager.bindResource(Object key, Object value);

//현재 스레드에서 바인딩된 리소스 가져오기
TransactionSynchronizationManager.getResource(Object key);

//리소스 언바인딩 (정리)
TransactionSynchronizationManager.unbindResource(Object key);

//리소스 존재 여부 확인
TransactionSynchronizationManager.hasResource(Object key);

 

✅ 트랜잭션 콜백

트랜잭션 이전 또는 이후 실행할 작업을 등록할 수 있다
  • beforeCommit : 커밋 직전에
  • beforeCompletion : 트랜잭션 종료 직전에
  • afterCommit : 성공적으로 커밋된 후에
  • afterCompletion : 트랜잭션이 끝난 후에

✅ 트랜잭션 콜백 관리

콜백 객체를 ThreadLocal에 등록/조회/초기화하는 API
메서드 설명
initSynchronization() 동기화 시작
isSynchronizationActive() 동기화 리스트 활성화 여부
registerSynchronization( TransactionSynchronization ts ) afterCommit 같은 콜백 객체 등록
getSynchronizations() 지금까지 등록된 모든 콜백 객체 반환
clearSynchronization() 트랜잭션 종료 시, 정리

 

✅ 트랜잭션 컨텍스트 상태

트랜잭션 상태를 추적 및 관리할 수 있다.
메서드 설명
isActualTransactionActive() 실제 트랜잭션 존재 여부
getCurrentTransactionName() 트랜잭션 이름 확인
isCurrentTransactionReadOnly() 읽기 전용 여부
getCurrentTransactionIsolationLevel() 격리 수준 확인

(이 외에도 있으나 생략하겠다...)

 

TSM은 콜백 객체를 통해 트랜잭션의 커밋 시점 이전 또는 이후에 원하는 로직을 수행할 수 있기 때문에 종종 필요해진다.
그러나 직접적으로 사용하는 것은 좋지 않기 때문에 직접 사용해야 하는 경우를 최소화하는 것이 좋다.