pengGeiii 2014-04-04
做开发几年了,一直也没搞清楚spring的事务传播性怎么回事,用的不太到位,经常出问题,最近在架构师课程上又学习到了这个地方,正好我们现在做的项目也用到了.
publicclassServiceA{
privateServiceBb;
voida(){
b.b3();
}
}
publicclassServiceB{
voidb1();
voidb2();
voidb3(){
b1();
b2();
}
}
假如传播性是REQUIRED_NEW,ServiceA,ServiceB的里面的方法都符合spring的切点规则,那么在调用a()的时候spring容器会创建几个事务?答案是2个.在调用a()的时候一个,b.b3()此时又一个,虽然b1(),b2()也符合切点规则但spring不会为他们2个启动新的事务.原因我们要从AOP的实现原理上来分析.
我们说AOP是在IOC的基础上出来的,没有IOC其实就没有AOP.spring是利用代理来完成事务控制的.
//这里假设是cglib代理
publicclassServiceAProxyextendsServiceA{
privateServiceAsvcA;
voida(){
begintransaction
svcA.a();
endtransaction
}
}
publicclassServiceBProxyextendsServiceB{
privateServiceBsvcB;
voidb1(){
begintransaction
svcB.b1();
endtransaction
}
voidb2(){
begintransaction
svcB.b2();
endtransaction
}
voidb3(){
begintransaction
svcB.b3();
endtransaction
}
}
这样在调用a.a()时只调用了A的代理方法a()和b的代理方法b3(),所以只开启了2个事务.