Spring无法为含@Transactional注解公共方法的Service生成代理对象导致事务失效问题求助
Spring无法为含@Transactional注解公共方法的Service生成代理对象导致事务失效问题求助
各位好,我遇到了一个Spring事务失效的棘手问题,折腾了好一阵都没解决,来请教下大家的思路。
情况是这样的:我写了一个MyController,通过构造注入引入了MyService,这个Service里有个标注了@Transactional注解的公共方法。但现在发现事务完全没生效——Service里打印的事务状态是false和null,数据库的更新操作也根本没持久化,而且日志显示myService是真实的类实例(package.x.y.z.MyService),不是Spring的CGLIB代理类(比如package.x.y.z.MyService$$EnhancerBySpringCGLIB$$a1b2c3d4这种格式)。
下面是我的相关代码:
Controller代码
import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor public class MyController { private final MyService myService; @PatchMapping("/some-endpoint") public SomeCustomObject updateSomeObject(){ // 这里输出的是真实类名,而非代理类名 log.info("myService proxy {}", myService.getClass()); return myService.updateSomeObject(); } }
Service代码
import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.support.TransactionSynchronizationManager; import javax.transaction.Transactional; @Service @RequiredArgsConstructor public class MyService extends SomeBaseService{ private final MyRepository myRepository; @Transactional(rollbackOn = SomeCustomException.class) public SomeCustomObject updateSomeObject(){ // 这里打印false和null,说明事务未激活 log.info("Is Transaction Active {} Name {} ", TransactionSynchronizationManager.isActualTransactionActive(), TransactionSynchronizationManager.getCurrentTransactionName()); SomeCustomObject someCustomObject = getTheObj(); updateTheObject(someCustomObject); return someCustomObject; } private SomeCustomObject getTheObj(){ return myRepository.HugeMethodNameThatsWhyUsedAMethodAsWrapper(); } private void updateTheObject(SomeCustomObject someCustomObject){ myRepository.setSomething(someCustomObject); } }
补充说明
MyRepository已经标注了@Repository注解,应该没问题;- 我查资料看到循环依赖可能导致Spring无法生成代理,于是改成了
@Autowired字段注入,但日志还是显示真实对象,代理依然没生成; - 另外,我还有个其他Controller,里面注入的另一个Service同样继承了
SomeBaseService,那个Service却能正常生成代理,事务也能正常工作,而且所有类都在同一个基础包下。
有没有大佬能帮我分析下,为啥这个MyService生成不了代理,导致事务失效呢?
备注:内容来源于stack exchange,提问作者vvs14
相关产品推荐
相关产品推荐

