> 类内无事务方法调用有事务方法,事务会失效。因为调用会绕过Spring AOP代理,导致注解无法被拦截。必须通过注入代理或拆分Service等方式,确保调用经过代理对象。 这是一个非常经典且常见的 Spring 事务问题。 直接回答:通常情况下,事务不会生效。 下面我将详细解释为什么,以及如何解决这个问题。 为什么事务会失效? 这个问题的核心在于 Spring A-OP(面向切面编程)的代理(Proxy)机制。Spring 的声明式事务()是通过 AOP 实现的。 1. 代理的工作原理: 当 Spring 容器启动时,它会扫描带有 注解的 bean。 对于这样的 bean,Spring 不会直接返回原始的对象实例,而是创建一个该对象的代理对象。 当外部代码调用这个 bean 的方法时,实际上是调用了这个代理对象的方法。 2. 代理的职责: 代理对象就像一个“门卫”。在调用实际的目标方法(你的业务代码)之前,它会检查方法上是否有 注解。 如果发现有,代理会开启一个事务。 然后,代理再调用原始对象的真正方法。 方法执行完毕后,代理会根据执行结果(是否抛出异常)来提交或回滚事务。 3...