星海

Spring · 单选题 · 第 51 题

Java 后端开发面试 · 第 51 题

同一个类中,没有事务注解的方法 A 直接调用本类带 @Transactional 的方法 B,B 的事务通常不生效。原因是?

  1. A方法 B 必须声明为 static,@Transactional 才能被 Spring 识别并生效
  2. B@Transactional 只能写在接口的方法上,写在类的方法上会被直接忽略
  3. C内部调用通过 this 进行,没有经过代理对象,事务拦截器没有机会介入
  4. D数据库不支持嵌套事务,所以 Spring 会主动跳过同一个类里的事务方法

答案

C C. 内部调用通过 this 进行,没有经过代理对象,事务拦截器没有机会介入

解析

Spring 的声明式事务基于 AOP 代理,外部调用先进入代理,由代理开启和提交事务;类内部 this.B() 直接调用目标对象,绕过了代理。解决办法有:把 B 拆到另一个 Bean,注入自身代理再调用,或者用 AopContext.currentProxy()。同理,private 方法上的 @Transactional 也不会生效。

在线刷这套题:即时判分、错题本、闪卡复习,不用登录就能练。