2008-09-16 13 views
11

Ich habe eine applicationContext.xml-Datei, und es hat zwei org.springframework.orm.jpa.JpaTransactionManager (jeder mit seiner eigenen Persistenzeinheit, verschiedene Datenbanken) in einer benutzerdefinierten Spring Middleware-Anwendung konfiguriert.

Ich möchte annotationsbasierte Transaktionen (@Transactional) verwenden, um TransactionStatus Commit, Save und Rollback nicht zu stören.

Ein Mitarbeiter erwähnt, dass etwas so wird verwirrt tun, wenn es mehrere Transaktionsmanager sind, auch wenn der Kontext-Datei richtig konfiguriert gesetzt ist (die Verweise auf die richtige Persistenzeinheit gehen. Wer jemals ein Problem sehen?JPA Multiple Transaction Manager


In der Config, würden Sie zwei Transaktionsmanager haben? würden Sie txManager1 und txManager2 haben?

das ist, was ich mit JPA, zwei verschiedene Spring-beans haben, die Transaktionsmanager.

Antwort

9

Ich nehme an, Sie haben 2 Möglichkeiten

Wenn Ihre Use-Cases niemals Updates für beide Datenbanken innerhalb der gleichen Transaktion benötigen, dann können Sie zwei JpaTransactionManagers verwenden, aber ich bin mir nicht sicher, ob Sie den @Transactional-Ansatz verwenden können ? In diesem Fall müssten Sie auf der älteren Mechanismus der Verwendung eines einfachen TransactionProxyFactoryBean definieren Transaktionsgrenzen zu Rückfall, zB:

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

Wenn Sie eine Transaktion sind, benötigen beide Datenbanken Spanning, dann benötigen Sie einen JTA verwenden Transaktionsmanager. Die API Staaten:

Diese Transaktions-Manager ist für Anwendungen geeignet, die eine einzelne JPA EntityManagerFactory für die Transaktionsdatenzugriff verwenden. JTA (normalerweise über JtaTransactionManager) ist für den Zugriff auf mehrere Transaktionsressourcen innerhalb derselben Transaktion erforderlich. Beachten Sie, dass Sie Ihren JPA-Provider entsprechend konfigurieren müssen, damit er an JTA-Transaktionen teilnehmen kann.

Dies bedeutet, dass Sie einen JTA-Transaktionsmanager bereitstellen müssen. In unserer Anwendung verwenden wir Config ähnlich den folgend:

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

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

Wenn Sie innerhalb eines appserver bereitstellen, dann der Feder muss JtaTransactionManager eine Lookup auf den realen XA-konformen JTA Transaktionsmanager von den appserver bereitgestellt tun. Sie können jedoch auch einen eigenständigen JTA-Transaktionsmanager verwenden (aber ich habe dies selbst noch nicht versucht)

Wie für die Konfiguration des Jpa-Persistenz-Providers bin ich nicht so vertraut. Welchen JPA-Persistenzanbieter verwenden Sie?

Der obige Code basiert auf unserem Ansatz, bei dem wir nativen Hibernate anstelle der JPA-Implementierung von Hibernate verwenden. In diesem Fall konnten wir die beiden HibernateTransactionManager-Beans loswerden und einfach sicherstellen, dass beide SessionFactories mit demselben JTA TM injiziert wurden, und dann das tx: annotation-driven-Element verwenden.

hoffe, das hilft

+0

können Sie den Beispielcode oder POC von jtaTransaction mit mehreren Datenbanken bereitstellen? – dhroove

+0

[Spring JTA mehrere Ressourcen-Transaktionen in Tomcat mit Atomikos Beispiel] (http://www.javacodegeeks.com/2013/07/spring-jta-multiple-resource-transactions-in-tomcat-with-atomikos-example.html) – anasanjaria

3

Die einzige Situation, in der Sie zwei Federtransaktionsmanager haben kann, ist, wenn Sie beide Transaktionen nie auf einmal geöffnet haben.Dies ist nicht unbedingt mit verteilten Transaktionen zu tun - die gleichen Einschränkungen gelten auch dann, wenn Sie möchten, dass die beiden Datenquellen vollständig getrennte (aber potentiell zeitlich überlappende) Transaktionslebenszyklen haben.

Intern Die Transaktionsmanager von Spring verwenden alle den TransactionSynchronizationManager von Spring, der eine Reihe kritischer Zustände in statischen ThreadLocal-Variablen beibehält, so dass die Transaktionsmanager gegenseitig stampfen.

Verwandte Themen