我们项目既有使用spring JPA也有使用spring JdbcTemplate,此次事务失效的原因是,项目之前配置的是spring jpa 的专门的事务管理器。
第一次尝试解决:添加spring JdbcTemplate 的事务管理器,并添加相应的注解驱动。不生效!!!
第二次尝试解决:问了下chartgpt,
如果在Spring配置文件中启用了多个注解驱动事务管理,那么在使用事务注解时,需要指定使用哪个事务管理器。可以使用@Transactional注解的value属性来指定事务管理器的名称或ID。
@Transactional(value = "transactionManager1")
public void doSomething() {
// ...
}
@Transactional(value = "transactionManager2")
public void doSomethingElse() {
// ...
}
终于生效了!!!
此次解决明确了几件事:
1.接口使用default不影响事务
2.JdbcTemplate 注入用@Resource不影响事务
顺便列下事务失效的常见原因:
1、方法没有被public修饰
在开发过程中,如果@Transactional事务注解添加在不是public修饰的方法上,这个时候,Spring的事务就会失效。
2、类没有被Spring托管
如果事务方法所在的类没有加载到Spring IoC容器中,也就是说,事务方法所在的类没有被Spring管理,从而导致Spring无法实现代理,所以,Spring事务也会失效。
3、不正确的异常捕获
如果事务方法抛出异常被 catch 处理了,导致 @Transactional 无法回滚而导致事务失效。
4、同一类中方法调用
如果同一个类中的两个方法分别为A和B,方法A上没有添加事务注解,方法B上添加了 @Transactional事务注解,方法A调用方法B,那么,方法B的事务会失效。
5、propagation事务传播行为配置错误
如果内部方法的事务传播类型为不支持事务的传播类型,那么,内部方法的事务在Spring中会失效。
6、rollbackFor参数设置错误
如果在@Transactional注解中rollbackFor参数标注了错误的异常类型,那么,Spring事务的回滚就无法识别,导致事务回滚失效。
7、没有配置事务管理器
即使在代码中使用了Spring的事务管理的功能,但是在项目中,如果没有配置Spring的事务管理器,Spring的事务也不会生效。
8、数据库本身不支持事务
Spring事务生效的前提是所连接的数据库要支持事务,如果底层的数据库都不支持事务,那么,Spring的事务肯定会失效。例如,如果使用的数据库为MySQL,并且选用了MyISAM存储引擎,则Spring的事务就会失效。
标签:事务,管理器,spring,Transactional,Spring,失效,注解 From: https://www.cnblogs.com/jqccan/p/17448146.html