개요
서버 개발 과정에서 새로은 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 네임을 트랜잭션에 명시해주면 트랜잭션이 정상적으로 작동하게 된다.