자바 & 스프링

ThreadLocal의 활용 - 트랜잭션 동기화

p829911 2021. 12. 22. 19:32

2021.12.20 - [자바 & 스프링] - 트랜잭션

위 블로그 포스팅에서 트랜잭션 동기화와 트랜잭션 동기화를 사용한 트랜잭션 전파를 언급한 적이 있다.

지금 작성하는 포스트에선 java의 ThreadLocal이 트랜잭션 동기화에 사용되고 있는 것을 코드를 통해 확인해보겠다.

Transaction 관리는 PlatformTransactionManager라는 인터페이스를 구현한 클래스들을 통해 사용된다.
정확히 말하면 AbstractPlatformTransactionManager가 PlatformTransactionManager 인터페이스를 구현하는데 AbstractPlatformTransactionManager를 각 persistence framework(JDBC, Hibernate, JPA, JTA)에서 상속받아 구현해서 사용하게 된다.
AbstractPlatformTransactionManager의 코드 구현을 보면 getTransaction 안에 doGetTransaction이라는 메서드로 트랜잭션을 가져오는데 그 중 가장 간단한 DataSourceTransactionManager의 코드를 보면 아래와 같이 구현되어 있다.

@Override
protected Object doGetTransaction() {
    DataSourceTransactionObject txObject = new DataSourceTransactionObject();
    txObject.setSavepointAllowed(isNestedTransactionAllowed());
    ConnectionHolder conHolder =
    (ConnectionHolder) TransactionSynchronizationManager.getResource(obtainDataSource());
    txObject.setConnectionHolder(conHolder, false);
    return txObject;
}

트랜잭션이 쓰레드 별로 동시성 이슈 없이 동기화 될 수 있는 이유는 TransactionSynchronizationManager에서 ThreadLocal을 사용하여 Transaction Resource를 저장하고 있기 때문이다.

 

'자바 & 스프링' 카테고리의 다른 글

string관련 클래스 성능 비교  (0) 2022.01.06
string concatenation compile optimization  (0) 2022.01.05
ThreadLocal의 정의와 사용법  (0) 2021.12.20
트랜잭션  (0) 2021.12.20
java - String, StringBuilder, StringBuffer  (0) 2021.12.08