2009-12-25 96 views
11
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="data.emf" /> 
</bean> 

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


<bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="data.emf" /> 
</bean> 

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


在我的服務層,我可以用@Transactional(name="transactionManager2");來識別,如果我有多個事務管理器我使用的事務管理器?春多個數據源@Transactional

+2

你爲什麼認爲你需要兩個交易管理者? – duffymo 2009-12-25 15:55:38

回答

21

您可以指定使用value attribute@Transactional使用哪個TX經理:

一個限定值指定 交易。

可以用於確定目標 事務管理器,匹配的 特定的PlatformTransactionManager bean定義的 限定符值(或豆名稱)。

例如:

@Transactional("txManager1"); 

或者,你可以用更明確的TransactionProxyFactoryBean,它爲您提供了哪些對象得到由什麼TX經理代理的細粒度控制。這仍然使用註釋,但它不會自動檢測bean,它是以bean爲基礎明確配置的。

這通常不是問題,但擁有多個事務管理器並不明智,除非您有足夠的理由這樣做。如果你發現自己需要兩個tx管理者,通常最好看看你是否可以做一個。例如,如果您的應用服務器中配置了兩個數據源,則可以將這兩個數據源合併到一個JtaTransactionManager中,而不是兩個獨立的JpaTransactionManagerDataSourceTransactionmanagers

+0

請評論我的帖子http://stackoverflow.com/questions/1962509/which-sessionfactory-should-be-use-for-transactionmanager – cometta 2009-12-26 02:59:13

+0

我從http://stackoverflow.com/questions/1902997/multiple- database-with-springhibernatejpa,它使用多個org.springframework.orm.jpa.JpaTransactionManager,並由@transactional(「name」)指向。所以這種方式可以嗎? – cometta 2009-12-26 03:36:18

+1

@skaffman,如果我使用DataSourceTransactionManager,如何將兩個數據源關聯到同一個事務管理器? – tsunade21 2011-03-18 11:25:58

1

更多關於需要多個事務管理器的信息。您可能會嘗試按順序進行嵌套或單獨的交易 - 然後您可以使用不同的傳播設置。您可以通過使用單個事務管理器進行配置來實現該功能,請參閱Transaction propagation