문제

하나의 applicationContext.xml 파일이 있고 여기에는 Spring 미들웨어 사용자 정의 애플리케이션에 구성된 두 개의 org.springframework.orm.jpa.JpaTransactionManager(각각 자체 지속성 단위, 서로 다른 데이터베이스 포함)가 있습니다.

TransactionStatus 커밋, 저장 및 롤백을 방해하지 않기 위해 주석 기반 트랜잭션(@Transactional)을 사용하고 싶습니다.

동료는 컨텍스트 파일이 올바르게 구성되었음에도 불구하고 여러 트랜잭션 관리자가 있을 때 이 작업을 수행하면 혼란스러워진다고 언급했습니다(참조는 올바른 지속성 단위로 이동합니다.문제를 본 사람이 있나요?


귀하의 구성에는 두 개의 트랜잭션 관리자가 있습니까?txManager1과 txManager2가 있습니까?

이것이 바로 트랜잭션 관리자인 두 개의 서로 다른 Spring 빈인 JPA를 사용하는 것입니다.

도움이 되었습니까?

해결책

2가지 선택이 있는 것 같아요

사용 사례에서 동일한 트랜잭션 내에서 두 데이터베이스 모두에 대한 업데이트가 필요하지 않은 경우 두 개의 JpaTransactionManager를 사용할 수 있지만 @Transactional 접근 방식을 사용할 수 있을지 확신할 수 없습니다.이 경우 간단한 메커니즘을 사용하는 이전 메커니즘으로 대체해야 합니다. TransactionProxyFactoryBean 거래 경계를 정의합니다. 예:

<bean id="firstRealService" class="com.acme.FirstServiceImpl"/>
<bean id="firstService"  
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="firstJpaTm"/>
    <property name="target" ref="firstRealService"/>
    <property name="transactionAttributes">
        <props>
           <prop key="insert*">PROPAGATION_REQUIRED</prop>
           <prop key="update*">PROPAGATION_REQUIRED</prop>
           <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
        </props>
    </property>
</bean>
<!-- similar for your second service -->

두 데이터베이스에 걸쳐 트랜잭션이 필요한 경우 JTA 트랜잭션 관리자를 사용해야 합니다.그만큼 API 상태:

이 트랜잭션 관리자는 트랜잭션 데이터 액세스를 위해 단일 JPA EntityManagerFactory를 사용하는 애플리케이션에 적합합니다.동일한 트랜잭션 내에서 여러 트랜잭션 리소스에 액세스하려면 JTA(일반적으로 JtaTransactionManager를 통해)가 필요합니다.JTA 트랜잭션에 참여하려면 JPA 제공자를 적절하게 구성해야 합니다.

이것이 의미하는 바는 JTA 트랜잭션 관리자를 제공해야 한다는 것입니다.우리 애플리케이션에서는 다음과 유사한 구성을 사용합니다.

<tx:annotation-driven transaction-manager="txManager"/>

<bean id="txManager" 
    class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManagerName" value="appserver/jndi/path" />
</bean>

앱 서버 내에 배포하는 경우 스프링 JtaTransactionManager는 앱 서버에서 제공하는 실제 XA 호환 JTA 트랜잭션 관리자를 검색해야 합니다.그러나 독립형 JTA 트랜잭션 관리자를 사용할 수도 있습니다(그러나 아직 직접 시도하지는 않았습니다).

Jpa 지속성 공급자 구성에 관해서는 그다지 익숙하지 않습니다.어떤 JPA 지속성 공급자를 사용하고 있나요?

위의 코드는 Hibernate의 JPA 구현과 반대로 네이티브 Hibernate를 사용하는 접근 방식을 기반으로 합니다.이 경우 우리는 두 개의 HibernateTransactionManager 빈을 제거하고 두 SessionFactory가 동일한 JTA TM으로 주입되었는지 확인한 다음 tx:annotation 기반 요소를 사용할 수 있었습니다.

도움이 되었기를 바랍니다

다른 팁

두 개의 Spring 트랜잭션 관리자를 가질 수 있는 유일한 상황은 두 트랜잭션을 동시에 열 수 없는 경우입니다.이는 본질적으로 분산 트랜잭션과 관련이 없습니다. 두 데이터 소스가 완전히 분리된(그러나 잠재적으로 시간이 겹치는) 트랜잭션 수명 주기를 갖기를 원하는 경우에도 동일한 제한 사항이 적용됩니다.

내부적으로 Spring의 트랜잭션 관리자는 모두 정적 ThreadLocal 변수에 여러 가지 중요한 상태를 유지하는 Spring의 TransactionSynchronizationManager를 사용하므로 트랜잭션 관리자는 서로의 상태 전체를 밟는 것이 보장됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top