已知REQUIRED的情况下
假设外部事务Service A的Method A()调用内部事务ServiceB的MethodB()。
假如ServiceB.MethodB()运行的时候发现自己没有在事务中,它就会为自己分配一个事务(仅仅是为自己)
我在一开始测试的时候写的是Service A的Method A()调用Service A的Method B(),A没写事务,B标注事务了,但是出现错误的时候并没有发生回滚,和上面的对比一下,这是为什么呢?
已知REQUIRED的情况下
假设外部事务Service A的Method A()调用内部事务ServiceB的MethodB()。
假如ServiceB.MethodB()运行的时候发现自己没有在事务中,它就会为自己分配一个事务(仅仅是为自己)
我在一开始测试的时候写的是Service A的Method A()调用Service A的Method B(),A没写事务,B标注事务了,但是出现错误的时候并没有发生回滚,和上面的对比一下,这是为什么呢?
因为aop底层是动态代理,service类有接口所以用的是jdk动态代理。在调用serviceA的a方法,是调用的代理对象的a方法,代理程序处理完后,再调用代理对象关联的原对象的a方法(实际调用),a中再调用b方法时,是this.b(),这个this就是原对象而不是代理对象,所以a方法中b方法的调用并没有被代理,也就不会处理你的事务注解。 然而不同的servise调用的时候,A的a方法调用B的b方法,B是自动注入的,是被代理的,b方法的调用也会被代理。 同一个service方法彼此调用的时候会出现你说的问题,解决方案就是A中自动注入自己(@Autowrite ServiceA serviceA;),然后在a方法中调用b方法时使用(serviceA.b())而不是this.b()或者写到2个不同的方法,A中自动注入B