Spring · 单选题 · 第 51 题
Java 后端开发面试 · 第 51 题
同一个类中,没有事务注解的方法 A 直接调用本类带 @Transactional 的方法 B,B 的事务通常不生效。原因是?
- A方法 B 必须声明为 static,@Transactional 才能被 Spring 识别并生效
- B@Transactional 只能写在接口的方法上,写在类的方法上会被直接忽略
- C内部调用通过 this 进行,没有经过代理对象,事务拦截器没有机会介入
- D数据库不支持嵌套事务,所以 Spring 会主动跳过同一个类里的事务方法
答案
C C. 内部调用通过 this 进行,没有经过代理对象,事务拦截器没有机会介入
解析
Spring 的声明式事务基于 AOP 代理,外部调用先进入代理,由代理开启和提交事务;类内部 this.B() 直接调用目标对象,绕过了代理。解决办法有:把 B 拆到另一个 Bean,注入自身代理再调用,或者用 AopContext.currentProxy()。同理,private 方法上的 @Transactional 也不会生效。