问题背景
项目重构过程中,使用了两个数据源,需要开启双写,每个数据源均需要各自的事务管理器,但是在Spring xml配置文件中新增一个事务管理器后,重新启动项目的时候报错了,具体的报错信息如下:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2: ddbTransactionManager,mysqlTransactionManager
...
此外,关于事务管理器,我是这样配置的:
<beans>
<!-- Transaction Manager -->
<tx:annotation-driven />
<!--DDB 的事务管理器-->
<bean id="ddbTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="ddbDataSource"/>
</bean>
<!--MySQL的事务管理器-->
<bean id="mysqlTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="mysqlDatasource"/>
</bean>
<beans>
解决方案
问题的原因在于早期项目中只有一个数据源,也只有一个与该数据源绑定的事务管理器,因此直接使用@Transactional()
注释时Spring会帮助我们自动识别出来,但是后期当项目中同时出现两个数据源和两个相关的事务管理器时,在使用@Transactional()
注解时如果不直接指定,Spring就不知道具体使用哪一个事务管理器来进行事务管理了,因此需要通过某种方式来具体指定一下。
指定的方式可以通过使用 @Transactional(transactionManager = "ddbTransactionManager")
or @Transactional(transactionManager = "mysqlTransactionManager")
来进行指定,上述修改完美地解决了上述问题,亲测有效。