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事务失效原因

你可能感兴趣的:(Spring,事务)