반응형

DB서버를 Scale Out 해서 사용하는 경우나, DB서버가 원격지에 분리되어 있는 경우

단일 트랜잭션만으로는 한계가 있기 때문에 (물론 사용하지 않도록 설계하는 것이 가장 좋겠지만...) 글로벌 트랜잭션을 사용하게 됩니다.

 

많이 알려진 게 아래 세가지 인데요..

2번은 3번으로 기능이 넘어가면서 Deprecated되었더군요. 

 

1. Atomikos XA TransactionManager 

 

2. Neo4j ChainedTransactionManager (Deprecated) 

 

3. Spring Data Commons ChainedTransactionManager

 

1번과 3번의 차이는 1번의 경우 2Phase Commit을 지원하는 것이고, 3번의 경우 2Phase Commit까지는 아니지만, 비슷하게 지원을 한다는 점과,  

가장 큰 것은 1번의 경우 설정이 매우 복잡하다는 점과, 3번은 설정이 매우 간편하다는 점 및 스프링과 통합이 쉽다는 점 입니다.

 

개인적인 생각으로 굳이 2Phase Commit까지 지원해야 되나.. 라는 생각과 왠지 Spring Data Commons의 경우 Spring Web MVC에서 사용하면, 안정적이지 않을까라는 생각으로 3번을 선택하게 되었습니다.

 

설정은 매우 간단합니다.

 


@Bean           // Bean 등록 시 이름이 매우 중요합니다. 이름이 다른 경우 defaultTransactionManager를 사용하게 됨.
public ChainedTransactionManager transactionManager() {
    ChainedTransactionManager transactionManager = new ChainedTransactionManager(transactionManagerGame(), transactionManagerGame_2(), transactionManagerGame_3(), transactionManagerGame_4(), ...);
    return transactionManager;
}
 
@Override        // @Transactional을 사용할 때 사용할 transactionManager를 지정해줌. (xml설정에서의 annotation-driven)
public PlatformTransactionManager annotationDrivenTransactionManager() {
    return transactionManager();
}
반응형
,