做开发几年了,一直也没搞清楚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个事务.
spring Aop 事务控制
猜你喜欢
转载自wfh6732.iteye.com/blog/2038975
今日推荐
周排行