강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

dreamjr님의 프로필 이미지
dreamjr

작성한 질문수

스프링 데이터 JPA

스프링 데이터 JPA 11. 트랜잭션

Multiple DataSource 사용 시 transaction 관련 질문 드립니다.

작성

·

2.9K

0

아래 비슷한 질문이 있네요. 추가로 질문 드리겠습니다 :)

3개의 database에 access하는 application을 작성 중입니다. 1개는 조회만(A라고 하겠습니다) / 나머지 2개(B, C라고 하겠습니다)는 수정도 하기 때문에 transaction이 필요합니다.

각 DB의 Configuration을 만들어, LocalContainerEntityManagerFactoryBean 및 TransactionManager를 설정하여 각각의 DB 접속에 성공하였습니다.

서비스 로직 중에, 하나의 메소드에서 B,C에 insert / update 하는 로직이 있어서 둘 다 commit / rollback 이 되어야 합니다.

ChainedTransactionManagerConfiguration를 사용하니 가능하였습니다.

configuration 파일은 다음과 같습니다.

@Configuration

public class ChainedTransactionManagerConfiguration {

 

    @Qualifier("abTransactionManager")

    @Bean

    public ChainedTransactionManager chainedTransactionManager(

            @Qualifier("BTransactionManager") JpaTransactionManager aTransactionManager,

            @Qualifier("BTransactionManager") JpaTransactionManager bTransactionManager

    ) {

        return new ChainedTransactionManager(aTransactionManager, bTransactionManager);

    }

}

abTransactionManager를 @Transactional 어노테이션에 설정하니 둘 다 롤백이 잘 되었습니다.

그런데, springboot 2.5부터 ChainedTransactionManagerConfiguration 이 deprecated 된다고 하네요.  이유는 2개의 AbstractPlatformTransactionManager 를 사용할 때에 side effect가 발생해서라고 합니다(https://github.com/spring-projects/spring-data-commons/issues/2232 를 참고하시면 됩니다.)

이와 같은 상황에서 ChainedTransactionManagerConfiguration 를 대체하여 추천해 주실 만한 것이 혹 있을까요? 그 외에 TransactionManager를 사용하지 않고서라도 할 수 있는 방법이 혹 있을지요?  대부분의 경우에는 그냥 사용해도 될 것 같기도 한데 좀 찜찜해서요

질문이 너무 길었네요. 감사합니다. ^^;

 

 

 

퀴즈

Spring Data 프로젝트 구조에 대한 설명 중 가장 올바른 것은 무엇일까요?

Spring Data는 Spring Data Commons와 Spring Data JPA와 무관한 독립 프로젝트입니다.

Spring Data Commons는 공통 기능을 제공하고 Spring Data JPA는 JPA 특정 기능을 추가합니다.

Spring Data Commons는 Spring Data JPA에 종속적인 하위 프로젝트입니다.

Spring Data JPA는 Spring Data Commons의 모든 기능을 포함하고 있습니다.

답변 1

0

백기선님의 프로필 이미지
백기선
지식공유자

https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/transaction/ChainedTransactionManager.html

해당 클래스의 JavaDoc에 보시면 TransactionSynchronization을 권장하고 있네요. Deprecated된 클래스는 언제 없어질지 모르기 때문에 가급적이면 사용을 삼가시는게 좋을 것 같습니다.

Instead of using ChainedTransactionManager for attaching callbacks to transaction commit (pre commit/post commit), either register a TransactionSynchronization to explicitly follow transaction cleanup with simplified semantics in case of exceptions.

dreamjr님의 프로필 이미지
dreamjr

작성한 질문수

질문하기