멀티 DB 환경에서 Transactionrequiredexception

minwoo Hyun·2023년 3월 14일
0

spring

목록 보기
2/2

개요
서버 개발 과정에서 새로은 DB 소스를 추가한뒤 업데이트 하는 과정에서 TransactionRequiredexception이 발생했다.

아무리 Transactional 어노테이션을 주입해도 소용이 없었는데 DB별로 JpaTransactionConfig 을 따로 생성해서 해결 할수 있게 되었다.

원인
Multiple DataSources 를 사용하는 환경에서 Transactional()로 트랜잭션 주입을 시도하는 경우 기본 Primary DB 의 트랜잭션 처리를 하게 된다.

해결
JpaTransactionConfig.java

@Configuration
public class JpaTransactionConfig {
    @Bean(name = "txWr")
    public PlatformTransactionManager txWr(@Qualifier("emf") EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        jpaTransactionManager.setEntityManagerFactory(entityManagerFactory);
        return jpaTransactionManager;
    }
}

위와 같이 Configuration 파일로 txWr 네임의 트랜잭션 bean을 선언 해준다.

TopicSubscriptionRepository.java

@Repository
@RequiredArgsConstructor
public class Repository {
    private final JPAQueryFactory jpaQueryFactory;
    
    @Transactional(transactionManager = "txWr")
    public long update(...){
        return this.jpaQueryFactoryPush.update..
                .execute();
    }    
}

이후 Repository에서 txPushWr 네임을 트랜잭션에 명시해주면 트랜잭션이 정상적으로 작동하게 된다.

profile
back-end developer

0개의 댓글