Spring 数据库事务配置

最近在接手公司的一个项目,在其中有涉及到事务回滚的情况,默认情况下在方法上加入@Transactional注解就可以针对在方法内抛出RuntimeException时进行数据库回滚,但测试的实际情况没有达到预期。分析系统配置后发现系统配置了两个同名的transactionManager bean实例。根据以前对Spring的理解认为Spring中定义了两个同名的bean肯定会报错啊,但这里为什么没有任何提示呢?下面就说一下为何没有提示。

Spring 上下文中定义同名bean

spring对同一配置文件中相同id或者name的两个或以上的bean时,做直接抛异常的处理,而对不同配置文件中相同id或者名称的bean,只会在打印日志级别为info的信息,信息内容大概为"Overriding bean definition for bean xxx : replacing xxx with beanDefinition "。后面出现的bean定义会覆盖前面出现的bean定义。这使得问题的排查很困难。Spring DefaultListableBeanFactory.java 中定义了allowBeanDefinitionOverriding 属性,该属性的默认值为true。只要将其值改为false就可以达到重复定义bean报错的目的


在回到一开始的问题,为什么数据库事务失效。分析系统后发现,系统配置了两个数据源,虽然两个数据源指定的事务管理器类型不是同一个类型的,但是由于使用了相同的bean id导致先定义的被覆盖了,导致对使用前一个事务管理器的数据源的事务失效了。

@Transactional注解不指定TransactionManager时会使用哪一个TransactionManager

@Transactional事务失效原因

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值