← 学习中心

Spring:AOP 与事务失效场景

掌握 AOP 的两种代理方式、自调用导致注解失效的根因,以及 Spring 事务常见的失效情形。

本节你将能

区分 JDK 动态代理与 CGLIB,解释同类方法自调用为何让 @Transactional/@Async 失效,并列举事务失效场景。

核心要点

  • 有接口默认 JDK 动态代理(基于接口),无接口用 CGLIB(基于继承,final 不可代理)。
  • 同类 A 调 B 用 this 调用原始对象,绕过代理,故 B 上的事务/异步/缓存注解不生效;解决:自注入、拆 Bean、AopContext.currentProxy()。
  • 事务失效:非 public、异常被 catch、抛出非 RuntimeException 且未配 rollbackFor、数据库引擎不支持事务等。

面试连招

追问:@Transactional(readOnly=true) 有什么用?REQUIRED 与 REQUIRES_NEW 的区别?

Spring:AOP 与事务失效场景 | 必学必会