You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 13:38:08