Search
Duplicate

Spring Multi DB Transaction (작성중)

배경

서로 다른 DB의 트랜잭션 처리 기술에 대해 포스팅 해보겠습니다.
확인해본 결과 크게 2가지 방법이 있습니다.
JTA를 사용한 방법은 3가지가 있는데 Atomikos에 대한 레퍼런스가 가장 많았고
공식 사이트에서 확인하니 유료 지원도 하는 것으로 확인됐습니다.

1. ChainedTransactionManager

스프링 프레임워크 지원하는 트랜잭션 묶음 처리 기능.

2. JTA(Java Transaction API)

자바 표준으로 분산 트랜잭션 구현 가능.
JTA 인터페이스를 구현한 3가지 구현체가 있음.
Atomikos
Bitronix
Narayana

내용

1. ChainedTransactionManager

각각의 DB 리소스에 대해 설정 하고 Chained Transaction을 사용합니다.
샘플 코드를 보면 매우 간단합니다.
Chained TransactionManger를 트랜잭션 묶음 처리할 필요가 있는 곳에 사용하면 됩니다.
@Configuration public class ChainedTransactionConfiguration { @Bean("name = chainedTxManager") @Primary public PlatformTransactionManager transactionManager(PlatformTransactionManager firstTxManager , PlatformTransactionManager secondTxManager) { // 영향도가 가장 큰 트랜잭션을 뒤에 배치한다. 역순으로 commit/rollback 하는데 중간에 rollback이 되면 나머지 트랜잭션도 rollback return new ChainedTransactionManager(firstTxManager, secondTxManager); } }
Java
복사
@RequiredArgsConstructor @Service public class ChaniedService { private final UserService userService; private final LogService logService; @Transactional("chainedTxManager") public void chainedTx(User user, Log userLog) { logService.saveLog(userLog); userService.saveUser(user); } }
Java
복사

2. Atomkios

각각 DB 리소스에 AtomikosDataSourceBean을 리턴하게 설정 하고
JtaTransactionManager를 사용.

결론

상황에 따라 선택해서 사용해야 합니다.
Atomikos는 느리지만 안전하게 처리가 필요할 경우
각 자원 별로 트랜잭션 처리가 필요한데 에러가 자주 발생하는 경우
적용하면 좋아 보입니다.
ChainedTransactionManager 는 트랜잭션 처리를 완벽하게 지원하지 않기때문에
비교적 에러가 자주 발생하지 않지만 빠른 처리가 필요한 경우 적합합니다.

1. ChainedTransactionManager

장점
비교적 쉬운 설정.
단점
완벽한 트랜잭션 처리 불가능.
단순히 트랜잭션을 묶어서 처리하는 것이기 때문에 묶인 트랜잭션 순서
에 따라 Commit/Rollback 처리가 영향을 받음.
2.4 버전 이후로 사용 자제 권고를 받음.

2. Atomikos

장점
각 자원의 트랜잭션을 안전하게 처리 가능.
단점
처리 속도가 느림.
각각의 트랜잭션를 제어하여 정합성을 맞추기 위해 통신이 부가적으로 발생하기 때문에
성능이 하락 할 수 밖에 없습니다.
그리고 샘플 코드를 구현하고 테스트 해보는 과정에서 Pool Size 등 설정 값들을 수정을 하라고
로그 메시지를 확인 할 수 있었습니다.
Atomikos 에 맞게 또 DB 관련 값들을 설정 해야 하는 부가 작업도 필요합니다.

참고