본문 바로가기
개념 공부/Spring & ORM

[Java / Spring] @Transational과 ChainedTransactionManager

by clean01 2025. 3. 12.

다른 두개 이상의 DB에 write를 해야해서, 여러개의 트랜잭션이 한꺼번에 커밋 또는 롤백이 되어야하는 상황이 있을 수 있다.

오늘은 그때 활용할 수 있는 ChainedTransactionalManager에 대해 알아보려한다. 

(현재는 deprecated되었지만, 아직도 쓰이는 곳이 있기에,,)

 

@Transactional

Checked Exception

  • 예외가 발생해도 트랜잭션이 Rollback 처리하지 않는다. (그대로 커밋됨)
  • 따라서 개발자가 checked exception을 catch해서 unchecked를 발생시키도록 하거나, catch 부분에서 명시적으로 롤백되도록 처리해줘야 한다.

Unchecked Exception

  • 예외가 발생하면 @Transactional로 묶인 메서드가 롤백처리된다.

 

 

TransactionManager

스프링에서 제공하는 인터페이스.

데이터베이스와 같은 외부 리소스를 사용할 때, 이를 관리하는 역할

 

 

Chained TransactionManager

Spring Data Commons에서 공식적으로 지원하는 라이브러리

여러 개의 나눠진 트랜잭션 매니저를 하나로 묶어서 사용하는 방식

묶인 트랜잭션은 순차적으로 트랜잭션을 실행하고 역순으로 커밋이 진행된다.

 

리스트를 돌면서 역순으로 커밋을 진행한다.

 

 

롤백 또한 트랜잭션들을 역순으로 돌면서 진행된다.

 

하지만 ChainedTransationManager도 여러 트랜잭션 간의 완벽한 정합성을 보장해주지 않는다. 

 

예를 들어 t1 -> t2 -> t3 라면

 

t1 시작 -> t2시작 -> t3시작 -> .. -> t3커밋 -> t2롤백 -> t1롤백

이러한 상황이 생길 수가 있다. 

 

Rollback은 나중에 선언된 트랜잭션에서 에러가 발생할 경우, 롤백 보장이 이뤄지기에 에러가 날 확률이 높은 트랜잭션을 후순위 Chain으로 묶어줘야 안전한 트랜잭션을 구성할 수 있다.

 

TransactionalManager의 사용법

 

아래와 같이 다중 데이터소스가 있다고 가정하겠다. 

사진출처: https://taes-k.github.io/2020/06/09/chained-transaction-manager/
사진출처: https://taes-k.github.io/2020/06/09/chained-transaction-manager/

 

 

그러면 그 데이터소스의 TransactionManager를 ChainedTransactionManager 생성자의 인자로 넣어 빈을 등록해주자.

사진출처: https://taes-k.github.io/2020/06/09/chained-transaction-manager/

 

 

그리고 사용할 때에는 아래와 같이 사용하면 된다.

    @Transactional(transactionManager = "chainedTransactionManager")
    public void example() {
        // 두개 이상의 다른 트랜잭션이 실행되는 로직
    }

 

위 예제에서는 없지만, ChainedTransactionManager 빈을 등록할 때, @Qualifier로 빈의 명칭을 등록해줄 수도 있을 것 같다.

 

 

 

하지만 위에서 언급하였다 싶이, 현재 ChainedTransactionManager는 deprecated된 상태인데

이에 대한 2개 이상의 트랜잭션을 다루는 대안으로는 아래와 같은 3가지 방법이 있다고 한다.

 

대안들

  • JPA Transactional
  • Saga pattern
  • Outbox pattern

 

 

Reference

https://joecp17.tistory.com/82

 

Chained Transaction Manager 파헤치기

서론 최근 리팩토링 작업을 진행하고 있다. 리팩토링 작업을 진행하던 도중 Transaction들이 Chain Transaction Manager로 묶여있는 걸 확인할 수 있었고 해당 Manager가 Deprecated가 된 상태로 있는 이슈가 있

joecp17.tistory.com

https://taes-k.github.io/2020/06/09/chained-transaction-manager/

 

ChainedTransactionManager 데이터소스 트랜잭션 연결하기

다중 데이터소스 트랜잭션 연결 요새는 MSA로 시스템을 구축하여 서버와 DB도 모두 각각 분리하여 마이크로하게 시스템 설계를 하는 추세이지만, 서비스에 따라 여러가지 이유로인해 여러개의 Da

taes-k.github.io