我在两个单独的spring xml文件中定义了两个事务管理器,并且它们都加载到spring上下文
文件一
<tx:annotation-driven transaction-manager="transactionManager1"/>
<bean id="transactionManager1"
class="org.springframework.jdbc.DataSourceTransactionManager">
...
</bean>
文件二
<tx:annotation-driven transaction-manager="transactionManager2"/>
<bean id="transactionManager2"
class="org.springframework.jdbc.DataSourceTransactionManager">
...
</bean>
如果我没有为下面的服务指明任何限定符,那么将使用哪个事务管理器spring。
public class TransactionalService {
@Transactional
public void setSomething(String name) { ... }
@Transactional
public void doSomething() { ... }
}
答案 0 :(得分:14)
从官方文档中查看11.5.6 Using @Transactional:
如果要连接的
transaction-manager
的bean名称的名称为<tx:annotation-driven/>
,则可以省略PlatformTransactionManager
标记中的transactionManager
属性。如果要依赖注入的PlatformTransactionManager
bean具有任何其他名称,则必须明确使用transaction-manager
属性[...]
由于您的所有事务管理器都没有命名为transactionManager
,因此您必须指定哪个事务管理器应该用于标有@Transactional
的方法。
更新:解决您修改过的问题。您可以在@Transactional
注释中指定要使用的事务管理器(请参阅:@Transactional.value()
):
@Transactional("transactionManager1")
//...
@Transactional("transactionManager2")
//...
但是我发现您当前的设置有几个问题:
您使用不同的事务管理器定义<tx:annotation-driven/>
两次。我不认为这样的配置是有效的
没有明确提供事务管理器,应该使用哪一个?
我认为应该解决的解决方案是定义<tx:annotation-driven transaction-manager="transactionManager1"/>
一次并使用@Transactional
来使用第一个管理员,使用@Transactional("transactionManager2")
来使用第二个管理器。或者相反。