2012-02-13 30 views
0

在一個web應用程序中,我使用了不同的組件,這些組件都使用Spring 3.0.x,它們自己的DataSourceTransactionManager(全部使用不同的名稱)。它們都包含在上下文中,通過包括它們的spring配置在內的「主」webapp。具有多個TransactionManager的Spring TransactionInterceptor

<import resource="classpath:spring-config-componentName.xml" /> 

在每一個我使用的聲明式事務管理組件的春天CONFIGS的,通過

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

啓用,每個方法應該是事務I添加註釋,如下所示:

@Transactional(propagation=Propagation.REQUIRES_NEW, value="transactionManager_componentName") 

我遇到的問題是,我發現只有一個TransactionInterceptor被創建,它有一個transactionManagers的引用,但沒有組件本身的一個。有沒有辦法解決這個問題?喜歡指定TransactionInterceptor作爲bean,然後在@Transactional註釋中引用它?

我認爲有可能通過在每個組件中指定一個TransactionProxyFactoryBean並通過xml配置進行聲明式transaciton管理。但這是我想避免的。

Spring文檔(10.5.6.2 Multiple Transaction Managers with @Transactional)中描述的建議方法不起作用。

回答

0

最後我發現問題所在,我不得不說它的工作原理就像它在春季文檔中所描述的那樣。 如果您使用的是Spring容器在多個TransactionManager和你正在使用@Transaction工作,如果你正在specifiying的TransactionManager這樣的:

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

所有你需要做的IST刪除規範的TransactionManager和使用這樣的配置:

<!-- ========== ENABLE ANNOTATIONS ========== --> 

<tx:annotation-driven/> 

<!-- ========== TRANSACTION MANAGER ========== --> 

<bean id="transactionManager_component1" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource_component1" /> 
    <property name="nestedTransactionAllowed" value="true" /> 
    <qualifier value="component1"/> 
</bean> 

而對於你的方法,你想在一個事務中運行,那麼就指定是這樣的:

@Transactional(value="component1") 
相關問題