工作中遇到一个在同一个service中,由无事务方法调本类的有事务方法时,事务没有生效的问题,查询资料后说这种情况不会开启事务,当时也只是记住了这一个结论,并对对你原因进行研究,今天没事特来研究下这个问题。
想必都知道,Spring的事务是基于Aop实现的,Aop实现又分为JDK和Cglib 两种方式,两种方式虽然实现房不同,但也有相似之处。
Cglib实现方式 JDK实现方式因为Spring Aop在对方法做额外增强时 ,是通过代理对象调用目标方法来做的,而代理对象呢并不能知道你目标方法内部又做了哪些东西,所以当从无事务方法进入到事务方法后,并不能开启事务,(因为事务是在代理对象调用目标方法前开启的,而目标方法时无事务的,只是内部调用的方法有事务注解,所以代理对象并不能知道,所以不会开启事务)。
网友评论