복붙노트

[SPRING] 여러 트랜잭션 관리자를 단일 트랜잭션으로 처리

SPRING

여러 트랜잭션 관리자를 단일 트랜잭션으로 처리

두 개의 서로 다른 데이터베이스를 사용해야하는 복잡한 상황이 있습니다. 거기에는 두 개의 다른 트랜잭션 관리자를 사용합니다. Spring에서 이러한 트랜잭션 관리자를 단일 트랜잭션으로 연결하는 방법이 있습니까? 두 번째 dataSource에 대한 예외의 경우 첫 번째 변경은 롤백되어야합니다.

<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
 <property name="transactionManager" ref="transactionManager" />
 <property name="transactionAttributes">
  <props>
    <prop key="insert*">PROPAGATION_REQUIRED</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop>
    <prop key="save*">PROPAGATION_REQUIRED</prop>
    <prop key="remove*">PROPAGATION_REQUIRED</prop>
    <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
  </props>
 </property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
 <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
 <property name="url" value="jdbc:oracle:thin:@dummyHost:1521:dummySID" />
 <property name="username" value="owner" />
 <property name="password" value="password" />
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 <property name="dataSource" ref="dataSource" />
</bean>

<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
 <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
 <property name="url" value="jdbc:oracle:thin:@dummyHost2:1521:dummySID2" />
 <property name="username" value="owner" />
 <property name="password" value="password" />
</bean>

<bean id="transactionManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 <property name="dataSource" ref="dataSource2" />
</bean>

해결법

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

    1.2 단계 커밋 (XA)을 지원하는 글로벌 트랜잭션 관리자가 필요합니다. 여러 독립적이고 무료로 사용할 수 있습니다. 저는 Spring 기반 프로젝트에서 Bitronix를 사용해 왔지만, Atomikos와 아마 다른 것들도 있습니다. http://en.wikipedia.org/wiki/Java_Transaction_API#Opensource_JTA_implementations를 참조하십시오.

    2 단계 커밋 (XA)을 지원하는 글로벌 트랜잭션 관리자가 필요합니다. 여러 독립적이고 무료로 사용할 수 있습니다. 저는 Spring 기반 프로젝트에서 Bitronix를 사용해 왔지만, Atomikos와 아마 다른 것들도 있습니다. http://en.wikipedia.org/wiki/Java_Transaction_API#Opensource_JTA_implementations를 참조하십시오.

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

    2.Spring의 JtaTransactionManager를 사용하여 두 DB가 단일 트랜잭션 관리자로 트랜잭션되도록 할 수 있습니다.

    Spring의 JtaTransactionManager를 사용하여 두 DB가 단일 트랜잭션 관리자로 트랜잭션되도록 할 수 있습니다.

    컨테이너의 컨테이너가 될 기본 구현을 선택해야합니다. WebLogic, WebSphere 및 OC4J 등. 또는 독립형, 심지어 오픈 소스 중 하나 : 예. Atomikos.

    XA 트랜잭션 관리는 상황 (구성 / 성능 / 문제점 해결 / 유지 보수 등)을 복잡하게 만듭니다. 그리고 많은 경우에 영리한 패턴으로 피할 수 있습니다.

    XA (분산 트랜잭션) 매니저를 사용해야하는지 여부에 대한 확실한 이해를 얻으려면 Spring의 Dave Syer가 작성한 환상적인 기사 인 Spring의 분산 트랜잭션 (XA 포함 / 제외)을 살펴보십시오.

  3. ==============================

    3.여러 데이터 소스를 통한 라우팅의 경우 abstractRoutingDataSource를 사용할 수 있지만 하나의 롤백이 다른 것에 영향을주는 것과 같은 요구 사항이있는 경우 분산 txn 관리를위한 JtaTransactionManager가 필요합니다.

    여러 데이터 소스를 통한 라우팅의 경우 abstractRoutingDataSource를 사용할 수 있지만 하나의 롤백이 다른 것에 영향을주는 것과 같은 요구 사항이있는 경우 분산 txn 관리를위한 JtaTransactionManager가 필요합니다.

  4. from https://stackoverflow.com/questions/8892887/spring-multiple-transaction-managers-single-transaction by cc-by-sa and MIT license