2012-02-13 77 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") 
相关问题