service的自调用 VS service之间调用

一、seervice的自调用:
    public interface AService {  
        public void a();  
        public void b();  
    }  
       
    @Service()  
    public class AServiceImpl1 implements AService{  
        @Transactional(propagation = Propagation.REQUIRED)  
        public void a() {  
            this.b();  
        }  
        @Transactional(propagation = Propagation.REQUIRES_NEW)  
        public void b() {  
        }  
    }  

 如上,为在一个对象,service里面自调用(自己方法调自己的方法),这样的情况,this.b()是不会事务增强的。可以参考我的另一篇博客 spring doc 学习 之 事务篇 。spring文档有说到过,必须外部调用才会事务增强。

原因就是:this.b(),这里的this就是当前对象,而非proxy对象,当然没有事务增强了。 (这里也应该是在mode=proxy的情况下,如果mode=aspectj则没有这个情况。因为aspectj没用代理)

--以上所说,只是内部调用的时候b()方法上面的Propagation.REQUIRES_NEW,不会再开启事务而已。也就是说b的事务配置没有生效,但是根据spring的事务传播特性,b此时还是在a()方法的事务范围内的,也就是说他们是同一个事务。

也可以参考这个博客 http://blog.csdn.net/wxwzy738/article/details/27566645

 以及我转的另一篇博客 :Spring事务传播特性的浅析——事务方法嵌套调用的迷茫

二、service之间的调用:

ServiceA {   
       
       
     void methodA() {   
         ServiceB.methodB();   
     }   
  
}   
  
ServiceB {   
       
         
     void methodB() {   
     }   
       
}      

 这种情况,因为都是外部调用,都会开启事务,并且依据事务传播特性,会传播到B方法。

总结,这两种情况有点像,要区分对待。可以加深理解aop对事务的处理

猜你喜欢

转载自cainiao1923.iteye.com/blog/2338760