spring事务控制采坑日记

用spring做事务控制有一段时间了,习惯了在方法上加@Transactional注解,今天发现一个问题,在这里记录一下,下面是一段伪代码来描述业务场景

public class OrderServiceImpl implements OrderService{ 
  
    public BaseResponse confirmOrder(){

        //do something  

        //新增订单数据,需要做事务控制
        addOrder (); 

        //do other 
    }

    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
    public int addOrder(Order order){
        ...
    }

}

由于需要做事务控制的代码只有一段,故将此部分代码抽出来添加事务控制,但是由于调用addOrder方法默认是this.addOrder调用,并不是通过代理对象调用的,故spring是无法做事务控制的。

改进方式1

    添加一个dao层,用于专门做事务控制,所有需要事务控制的方法在此层实现

改进方式2

    将直接调用addOrder方法改成((OrderService) AopContext.currentProxy()).addOrder,这样就是通过代理对象来执行,不会影响事务。实际开发中,service可能是对外暴露的协议,如果不想将此方法暴露出去,可以实现一个新接口,在新接口中添加此方法。同时需要在spring配置中添加<aop:aspectj-autoproxy expose-proxy="true"/>

猜你喜欢

转载自www.cnblogs.com/1ning/p/9208401.html
今日推荐