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

Spring事务不生效,不是代码写错了,而是“没被Spring真正管到”——事务基于AOP代理,只要调用链脱离了代理上下文,或者配置/环境踩了坑,事务就形同虚设。下面挑最常见、最易忽略的8类场景说清楚。
事务方法所在的类必须是Spring容器中的Bean,否则代理根本不会生成。比如:
解决办法:确保类由Spring托管,且能通过 @Autowired 正常注入。
@Transactional 只对 public 方法生效。Spring默认用JDK动态代理或CGLIB,它们都只能拦截public方法调用:
如真需在非public方法用事务,得切换为AspectJ静态织入(不推荐,增加复杂度)。
这是高频陷阱。事务靠代理对象触发,而 this.methodB() 是直接调用目标对象,绕过了代理:
正确做法:让Spring注入自身(@Autowired this),再通过注入的引用调用;或改用ApplicationContext获取代理Bean。
事务是否回滚,取决于“有没有把异常抛给事务切面”:
对策:
– 配置 @Transactional(rollbackFor = Exception.class)
– 或在catch里调用 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
再完善的Spring配置,也救不了底层不支持事务的环境:
注意:Spring Boot自动配置会帮你配好DataSourceTransactionManager,但自定义多数据源时务必手动配齐。
传播机制决定事务如何“嵌套”或“挂起”,错配会导致事务意外终止或隔离失败:
Spring事务依赖 ThreadLocal 绑定当前事务状态:
不能靠“加事务注解”解决,得换思路:用消息队列+最终一致性,或引入Seata等分布式事务框架。
这些虽不总出现,但一旦发生就很难排查:
基本上就这些。核心就一条:Spring事务不是魔法,它严格依赖代理机制和上下文传递。抓住“谁调用、怎么调、抛什么、在哪跑”这四个关键点,90%的失效问题都能快速定位。
以上就是Spring事务失效场景有哪些 Spring事务不生效原因【总结】的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号