针对spring的事务注解@Transactional无效问题解决

说说我的使用场景,service.aMethod()中需要对db先进行插入操作,这个操作不做事务,插入后需要调用bMethod()和cMethod(),bMethod和cMethod需要保证事务的一致性,且这两个方法是多方公用,我是这样写的:

@Service
public class Service(){
    
    public Object aMethod() {
        //插入操作 insert()
        try {
            bMethod();
            cMethod();
        }catch (Exception e){
                //捕获异常后修改对应的数据
            e.getMessage();//打印失败原因
            //修改对应数据并返回对应信息
            return error("01","失败");
        }
        return success(null);
    }

    
    @Transactional
    public void bMethod(){
        //数据库操作..
    }

    
    @Transactional
    public void cMethod(Integer orId){
        //修改、插入操作
    }
}


然而,理想很美好,现实很骨感,在操作工程中,我有意先让bMethod throw new RentimeException();异常,根据我的理解此时应该会发生回滚,现实却很打脸,我的@Transactional仿佛失效了,why?
事情总有解决的办法,能这么写还是说明自己对spring的事务管理不够理解。原因是这样的:
Spring之所以可以对开启@Transactional的方法进行事务管理,是因为Spring为当前类生成了一个代理类,然后在执行相关方法时,会判断这个方法有没有@Transactional注解,如果有的话,则会开启一个事务。
但是,上面同一个类中A调用B时,使用的并不是代理对象,从而导致调用bMethod()时也不是代理对象,从而导致@Transactional失效。所以,Spring从同一个类中的某个方法调用另一个有注解(@Transactional)的方法时,事务会失效,宝宝们写事务的时候一定要注意到这一点。
那怎么解决呢,当然就是在另起一个类,当然接口更好一点,在这个类中调用就可以了:

@service
pulic class TransService(){
    
    @Transactional
    public void transTest(){
        bMethod();
        cMethod();
    }
    
    public void bMethod(){
        //..略
    }
    public void cMethod(){
        //..略
    }
    }
    
@service
public class Service(){
    
    @AutoWried
    private TransService transService;
    
    public Object aMethod() {
        //插入操作 insert()
        try {
            transService.transTest();
        }catch (Exception e){
                //捕获异常后修改对应的数据
            e.getMessage();//打印失败原因
            //修改对应数据并返回对应信息
            return error("失败");
        }
        return success("正常返回");
    }
    }
    


纯手敲笔记,可能有某个字母不对的地方,理解万岁!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值