7
votes

Spring Plusieurs gestionnaires de transactions, transaction unique

J'ai une situation complexe où je dois utiliser 2 bases de données différentes, là-bas, j'utilise 2 gestionnaires de transactions différents. Existe-t-il un moyen de relier ces gestionnaires de transactions pour travailler dans une seule transaction? En cas d'exception sur la deuxième source de données de données sur la première doit être roulée.

<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>


0 commentaires

3 Réponses :


4
votes

Vous avez besoin d'un gestionnaire de transactions global qui soutient 2 phases-commit (XA). Plusieurs personnes indépendantes et libres sont disponibles. J'ai utilisé Bitronix dans un projet à ressort, mais il y a aussi atomikos, et probablement d'autres. Voir 0 commentaires



5
votes

Vous pouvez utiliser le ressort JTatransActionManager pour s'assurer que les deux DBS sont transactions avec un seul gestionnaire de transactions.

Remarque, vous devez choisir une implémentation sous-jacente qui peut être celle d'un conteneur: E.G. Weblogic, WebSphere et OC4J, etc. ou un stand seul, même une source ouverte: E.G. atomikos .

Cependant

XA Transaction Gestion complique des éléments (configuration / performance / résolution de problèmes / maintenance / etc.). Et dans beaucoup de cas, il peut être évité par des motifs intelligents.

Pour mieux comprendre si vous devez utiliser un gestionnaire de transactions XA (par exemple distribué), jetez un coup d'œil à cet article fantastique par Dave Syer de Spring: Transactions distribuées au printemps, avec et sans XA


0 commentaires