spring Aop 事务控制

做开发几年了,一直也没搞清楚spring的事务传播性怎么回事,用的不太到位,经常出问题,最近在架构师课程上又学习到了这个地方,正好我们现在做的项目也用到了.


public class ServiceA{

   private ServiceB b;
 
    void a(){
      b.b3();
    }

}


public class ServiceB{

    void b1();
    void b2();

    void b3(){
       b1();
       b2();
    }

}

假如传播性是 REQUIRED_NEW ,ServiceA,ServiceB 的 里面的方法都符合spring的切点规则,那么在调用 a() 的时候spring 容器会创建几个事务? 答案是2个. 在调用a()的时候一个,b.b3()此时又一个,虽然 b1(),b2()也符合切点规则但spring不会为他们2个启动新的事务.原因我们要从AOP的实现原理上来分析.
    我们说AOP是在IOC的基础上出来的,没有IOC其实就没有AOP.spring 是利用代理来完成事务控制的.
// 这里假设是cglib代理
public class ServiceAProxy extends ServiceA{

   private ServiceA svcA;
 
    void a(){
      begin transaction
      svcA.a();
      end transaction
    }

}

public class ServiceBProxy extends  ServiceB {

   private  ServiceB svcB;

    void b1(){
      begin transaction
      svcB.b1();
      end transaction
    }
    void b2(){
      begin transaction
      svcB.b2();
      end transaction
    }

    void b3(){
      begin transaction
       svcB.b3();
      end transaction
    }

}


这样在调用a.a()时 只调用了A的代理方法a() 和 b的代理方法 b3(),所以只开启了2个事务.


猜你喜欢

转载自wfh6732.iteye.com/blog/2038975