Vra

Ek het een applicationContext.xml-lêer, en dit het twee org.springframework.orm.jpa.JpaTransactionManager (elk met sy eie volhardingseenheid, verskillende databasisse) wat in 'n Spring-middelware-pasgemaakte toepassing opgestel is.

Ek wil annotasie-gebaseerde transaksies (@Transactional) gebruik om nie te mors met TransactionStatus commit, save en rollback nie.

'n Medewerker het genoem dat iets deurmekaar raak om dit te doen wanneer daar veelvuldige transaksiebestuurders is, al is die kontekslêer korrek opgestel (die verwysings gaan na die korrekte volhardingseenheid.Het iemand ooit 'n probleem gesien?


In jou konfigurasie, sou jy twee transaksiebestuurders hê?Sou jy txManager1 en txManager2 hê?

Dit is wat ek het met JPA, twee verskillende Spring boontjies wat transaksiebestuurders is.

Was dit nuttig?

Oplossing

Ek dink jy het 2 keuses

As u gebruiksgevalle nooit opdaterings aan beide databasisse binne dieselfde transaksie benodig nie, kan u twee JpaTransactionManagers gebruik, maar ek is nie seker dat u die @Transactional-benadering sal kan gebruik nie?In hierdie geval sal jy moet terugval op die ouer meganisme van die gebruik van 'n eenvoudige TransactionProxyFactoryBean om transaksiegrense te definieer, bv.

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

As jy 'n transaksie benodig wat oor beide databasisse strek, sal jy 'n JTA-transaksiebestuurder moet gebruik.Die API verklaar:

Hierdie transaksiebestuurder is geskik vir toepassings wat 'n enkele JPA EntityManagerFactory gebruik vir transaksionele datatoegang.JTA (gewoonlik deur JtaTransactionManager) is nodig vir toegang tot verskeie transaksionele hulpbronne binne dieselfde transaksie.Let daarop dat jy jou JPA-verskaffer dienooreenkomstig moet opstel om dit aan JTA-transaksies te laat deelneem.

Wat dit beteken, is dat u 'n JTA-transaksiebestuurder moet verskaf.In ons toepassing gebruik ons ​​config soortgelyk aan die volgende:

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

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

As jy binne 'n toepassingbediener ontplooi, moet die lente JtaTransactionManager 'n soektog doen na die regte XA-voldoenende JTA-transaksiebestuurder wat deur die toepassingbediener verskaf word.U kan egter ook 'n selfstandige JTA-transaksiebestuurder gebruik (maar ek het dit nog nie self probeer nie)

Wat die konfigurasie van die Jpa-volhardingsverskaffer betref, is ek nie so bekend nie.Watter JPA-volhardingsverskaffer gebruik jy?

Die kode hierbo is gebaseer op ons benadering, waar ons inheemse Hibernate gebruik het in teenstelling met Hibernate se JPA-implementering.In hierdie geval kon ons van die twee HibernateTransactionManager-bone ontslae raak, en eenvoudig verseker dat beide SessionFactories met dieselfde JTA TM ingespuit is, en dan die tx:annotation-gedrewe element gebruik.

Hoop dit help

Ander wenke

Die enigste situasie waarin jy twee Spring-transaksiebestuurders kan hê, is as jy nooit albei transaksies op een slag oop het nie.Dit is nie intrinsiek te doen met verspreide transaksies nie - dieselfde beperkings geld selfs al wil jy hê dat die twee databronne heeltemal aparte (maar moontlik oorvleuelende in tyd) transaksielewensiklusse moet hê.

Intern gebruik Spring se transaksiebestuurders almal Spring se TransactionSynchronizationManager wat 'n klomp kritieke toestande in statiese ThreadLocal-veranderlikes behou, sodat transaksiebestuurders gewaarborg is om oor mekaar se toestand te stamp.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top