개발지식 먹는 하마 님의 블로그
TSM (Transaction Synchronization Manager) 본문
이전에 정리했던 글에서 트랜잭션 흐름과 추상화에 대해 설명할 때,
한 번 언급된 요소인 Transaction Manager에 관한 내용이다.
https://devhippo.tistory.com/158
Spring에서의 Transaction 트랜잭션 - 전파, 격리 수준 등
Transaction이란?데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 Transaction의 특징 + 관련 기능✅ 원자성 Atomicity + Commit & Rollback1개의 트랜잭션 내의 연산이 모
devhippo.tistory.com
PlatformTransactionManager
기술마다 사용하는 리소스가 다루기 때문에 트랜잭션 관리를 추상화한 것이 바로 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은 콜백 객체를 통해 트랜잭션의 커밋 시점 이전 또는 이후에 원하는 로직을 수행할 수 있기 때문에 종종 필요해진다.
그러나 직접적으로 사용하는 것은 좋지 않기 때문에 직접 사용해야 하는 경우를 최소화하는 것이 좋다.
'개발 지식' 카테고리의 다른 글
Spring에서의 Transaction 트랜잭션 - 전파, 격리 수준 등 (3) | 2025.08.16 |
---|---|
디자인 패턴에서 발견하는 객체지향 (0) | 2025.08.06 |
실무에서 사용하는 Java와 Spring 버전 (0) | 2025.08.06 |
한 호흡으로 정리하는 객체지향 (0) | 2025.08.05 |
Git 커밋 컨벤션을 지키면서 Commit하기! (0) | 2025.03.07 |