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>
3 Réponses :
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
Pour routage via plusieurs données de données, vous pouvez utiliser abstractroutingdataSource a > Mais si vous avez des exigences comme une rollbackack affectant un autre, vous auriez besoin d'un JTatransactionManager pour la gestion TXN distribuée. P>
Vous pouvez utiliser le ressort JTatransActionManager pour s'assurer que les deux DBS sont transactions avec un seul gestionnaire de transactions. P>
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 . P>
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. P>
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 P>