12_spring@Transactional失效的场景总结及原因

①数据库引擎不支持事务
数据库本身不支持事务,那么就算使用@Transactional也没用。
②服务类没有被 Spring 管理
服务类必须交由spring管理,否则就不会产生代理对象,从而执行事务逻辑。
③方法不是 public
spring解析注解属性时会判断是否是public,如果不是,则注解属性为null,则注解无法生效
在这里插入图片描述

④异常被捕获
在这里插入图片描述
spring源码在执行方法时如果有异常会执行回滚事务,由于我们自行处理异常,那么就不会再执行回滚流程。
⑤异常类型不匹配
**加粗样式**
spring源码会判断异常是否是超过默认的异常或者指定异常。如果超过不会执行rollback流程。
⑥方法被final修饰
由于Spring使用JDK动态代理或CGLIB代理来实现事务管理,如果方法被final修饰,代理对象无法覆盖这些方法,导致事务注解失效。
⑦自调用问题
当一个类中的事务方法直接调用本类中另一个事务方法时,由于没有经过代理对象,事务注解可能不会生效。
⑧没有开启事务管理
需要在Spring的配置类上添加@EnableTransactionManagement注解来启用事务管理功能。
⑨事务传播行为配置错误
若事务方法的传播行为设置不当,如设置为Propagation.NOT_SUPPORTED、Propagation.NEVER或Propagation.SUPPORTS,可能会导致事务不生效或不期望的行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值