Spring事务失效场景有哪些 Spring事务不生效原因【总结】

admin 百科 14
Spring事务不生效的8类常见原因:类未被Spring管理、方法非public、this调用绕过代理、异常未抛出或未配置回滚、数据库不支持事务、传播行为错误、异步/多线程破坏上下文、final/static方法或未开启事务管理。

Spring事务失效场景有哪些 Spring事务不生效原因【总结】-第1张图片-佛山资讯网

Spring事务不生效,不是代码写错了,而是“没被Spring真正管到”——事务基于AOP代理,只要调用链脱离了代理上下文,或者配置/环境踩了坑,事务就形同虚设。下面挑最常见、最易忽略的8类场景说清楚。

类没被Spring管理

事务方法所在的类必须是Spring容器中的Bean,否则代理根本不会生成。比如:

  • 忘了加 @Service@Component 等注解
  • new 关键字手动创建对象(绕过IoC容器)
  • 配置类未被 @Configuration 标记或未被扫描到

解决办法:确保类由Spring托管,且能通过 @Autowired 正常注入。

方法访问权限不对

@Transactional 只对 public 方法生效。Spring默认用JDK动态代理或CGLIB,它们都只能拦截public方法调用:

  • private / protected / package-private 方法上加 @Transactional → 无任何效果
  • 官方文档明确说明:非public方法标注后不会报错,但事务设置完全不生效

如真需在非public方法用事务,得切换为AspectJ静态织入(不推荐,增加复杂度)。

同一类中this调用导致代理失效

这是高频陷阱。事务靠代理对象触发,而 this.methodB() 是直接调用目标对象,绕过了代理:

  • 方法A(无@Transactional)调用本类的 methodB(有@Transactional)→ methodB 事务不生效
  • 即使A自己也有@Transactional,this调用依然不走代理

正确做法:让Spring注入自身(@Autowired this),再通过注入的引用调用;或改用ApplicationContext获取代理Bean。

异常处理不当,事务不回滚

事务是否回滚,取决于“有没有把异常抛给事务切面”:

标签: mysql app nas 动态代理 spring容器 red

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~