expected single matching bean but found 2: transactionManager1,transactionManager

问题背景

项目重构过程中,使用了两个数据源,需要开启双写,每个数据源均需要各自的事务管理器,但是在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") 来进行指定,上述修改完美地解决了上述问题,亲测有效。

参考资料

  1. expected single matching bean but found 2: transactionManager1,transactionManager
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、事务简单介绍 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。 1.1 事...
    tuacy阅读 116,887评论 11 110
  • 这部分的参考文档涉及数据访问和数据访问层和业务或服务层之间的交互。 Spring的综合事务管理支持覆盖很多细节,然...
    竹天亮阅读 1,053评论 0 0
  • 原文链接:https://docs.spring.io/spring-boot/docs/1.4.x/refere...
    pseudo_niaonao阅读 4,757评论 0 9
  • PartV.TransactiomManagement github 地址 https://github.com/...
    天幕_bc1a阅读 1,141评论 2 0
  • 与这道美味邂逅,缘自一次聚会。一干朋友在乡下消暑,主人做了大桌土菜,令人垂涎,开饭在即,某帅哥并不端碗,直奔厨房,...
    梦里李大侠阅读 476评论 0 0