
此处的this指向目标对象,因此调用this.b()将不会执行b事务切面,即不会执行事务增强,因此b方法的事务定义@Transactional(propagation = Propagation.REQUIRES_NEW)将不会实施.
在一个Service内部,事务方法之间的嵌套调用,普通方法和事务方法之间的嵌套调用,都不会开启新的事务.是因为spring采用动态代理机制来实现事务控制,而动态代理最终都是要调用原始对象的,而原始对象在去调用方法时,是不会再触发代理了!
解决方法:
1、可以把方法B放到另外一个service或者dao,然后把这个server或者dao通过@Autowired注入到方法A的bean里面,这样即使方法A没用事务,方法B也可以执行自己的事务了。
2、在java配置类上添加注解@EnableAspectJAutoProxy(exposeProxy = true)方式暴漏代理对象,然后在service中通过代理对象AopContext.currentProxy()去调用方法。

参考链接:
https://www.jianshu.com/p/0da29e4f354a
https://blog.csdn.net/panchao888888/article/details/82866315
本文详细探讨了Spring框架中事务管理的内部机制,特别是在Service层内部事务方法间嵌套调用时,事务并不会如预期般开启新事务。文章提供了两种解决方案,一种是将方法B放置于另一个Service中并注入,另一种是在配置类中使用@EnableAspectJAutoProxy注解并通过AopContext.currentProxy()调用方法。

被折叠的 条评论
为什么被折叠?



