在 Spring 框架中, 注解失效(即发生异常时不回滚)是开发中非常常见的问题,也是面试的高频考点。 的底层实现依赖于 Spring AOP(动态代理) 和 数据库本身的事务支持。只要破坏了这两者中的任何一个环节,事务就会失效。 以下是导致 事务失效的常见场景,按原因分类总结: --- 一、 方法签名或修饰符问题 1. 方法不是 的 原因:Spring AOP 默认只会对 方法进行拦截并生成代理。如果将 加在 、 或包可见(default)的方法上,Spring 不会报错,但事务根本不会生效。 解决:确保加了注解的方法是 的。 2. 方法被 或 修饰 原因:Spring AOP 通常基于 CGLIB 实现(针对没有实现接口的类)。CGLIB 是通过生成子类来创建代理对象的。 方法不能被重写, 方法属于类级别的调用,无法被子类拦截,因此代理机制会失效。 解决:去除 或 修饰符。 --- 二、 AOP 代理问题(内部调用) 3. 同一个类中的方法内部调用(最常见的坑) 场景:类 中有方法 和方法 。 上加了 ,但在 中直接调用了 。外部调用 时, 的事务失效。 原因:Spring ...