복붙노트

[SPRING] JPA 다중 트랜잭션 관리자

SPRING

JPA 다중 트랜잭션 관리자

하나의 applicationContext.xml 파일이 있고, Spring 미들웨어 커스텀 애플리케이션에 구성된 두 개의 org.springframework.orm.jpa.JpaTransactionManager (각각 자체 퍼시스턴스 유닛, 다른 데이터베이스)가 있습니다. 주석 기반 트랜잭션 (@Transactional)을 사용하여 TransactionStatus commit, save 및 rollback을 사용하지 않으려합니다. 공동 작업자는 컨텍스트 파일이 올바르게 설정 되었더라도 참조 트랜잭션이 올바른 지속성 단위로 설정되어 있어도 트랜잭션 관리자가 여러 명일 때이 작업을 혼동하는 것으로 언급했습니다. 누구든지 문제가 발생 했나요?

귀하의 구성에서 두 개의 트랜잭션 관리자가 있습니까? txManager1 및 txManager2가 있습니까? 트랜잭션 관리자 인 두 개의 다른 Spring bean 인 JPA에서 내가 가진 것은 이것이다.

해결법

  1. ==============================

    1.너는 2 가지 선택을 할 것 같아.

    너는 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 상태 :

    이것이 의미하는 것은 JTA 트랜잭션 관리자를 제공해야한다는 것이다. 우리의 응용 프로그램에서는 다음과 비슷한 config를 사용합니다.

    <tx:annotation-driven transaction-manager="txManager"/>
    
    <bean id="txManager" 
        class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManagerName" value="appserver/jndi/path" />
    </bean>
    

    Appserver 내에서 배포하는 경우 Spring JtaTransactionManager는 App Server가 제공 한 실제 XA 호환 JTA 트랜잭션 관리자를 조회해야합니다. 그러나 독립 실행 형 JTA 트랜잭션 관리자를 사용할 수도 있습니다 (그러나 아직 나 자신을 시도하지 않았습니다).

    Jpa 지속성 공급자 구성에 관해서는 익숙하지 않습니다. JPA 지속성 공급자는 무엇을 사용하고 있습니까?

    위의 코드는 Hibernate의 JPA 구현과 반대로 고유 한 Hibernate를 사용했던 우리의 접근 방식을 기반으로합니다. 이 경우 우리는 두 개의 HibernateTransactionManager 빈을 없애고 두 개의 SessionFactories가 같은 JTA로 주입되었는지 확인한 다음 tx : annotation-driven 엘리먼트를 사용할 수있다.

    희망이 도움이

  2. ==============================

    2.두 개의 Spring 트랜잭션 관리자를 가질 수있는 유일한 상황은 한 번에 두 트랜잭션을 모두 열지 않은 경우뿐입니다. 이는 본질적으로 분산 트랜잭션과 관련이 없습니다. 두 데이터 소스가 완전히 분리 된 (그러나 잠재적으로 중복되는) 트랜잭션 라이프 사이클을 원할 경우에도 동일한 제한 사항이 적용됩니다.

    두 개의 Spring 트랜잭션 관리자를 가질 수있는 유일한 상황은 한 번에 두 트랜잭션을 모두 열지 않은 경우뿐입니다. 이는 본질적으로 분산 트랜잭션과 관련이 없습니다. 두 데이터 소스가 완전히 분리 된 (그러나 잠재적으로 중복되는) 트랜잭션 라이프 사이클을 원할 경우에도 동일한 제한 사항이 적용됩니다.

    내부적으로 Spring의 트랜잭션 관리자는 모두 Spring의 TransactionSynchronizationManager를 사용하여 정적 ThreadLocal 변수에 많은 수의 임계 상태를 유지하므로 트랜잭션 관리자는 서로의 상태를 모두 압도 할 수 있습니다.

  3. from https://stackoverflow.com/questions/75700/jpa-multiple-transaction-managers by cc-by-sa and MIT license