Expose

关于在Spring 中方法内部调用自身方法事务 REQUIRE_NEW 不生效的解释

僤鯓⒐⒋嵵緔 提交于 2019-11-29 22:50:55
问题来自: Spring事务的传播行为中REQUIRES_NEW真的有效吗 这个是Spring 对拦截的实现有关。Spring 拦截实现的方法是动态生成一个代理类。正常使用 @Autowired 注解注入的实际上就是这个代理类。 一。 对于有接口实现的类代理,Spring 使用的是 Java 自带的代理生成方式。这种方式对 target.method() 方式的调用是可以拦截到的,对于类内调用 method() 方式则拦截不到。 看以下代码 public interface DynamicProxyInterface { void a(); void b(); } public class DynamicProxy implements DynamicProxyInterface { @Override public void a() { System.out.println("this is a"); b(); } @Override public void b() { System.out.println("this is b"); } public static void main(String[] args) { DynamicProxy target = new DynamicProxy(); DynamicProxyInterface dynamicProxy =

【每日提高之声明式事物】spring声明式事务 同一类内方法调用事务失效

别等时光非礼了梦想. 提交于 2019-11-26 21:34:45
【问题】 Spring的声明式事务,我想就不用多介绍了吧,一句话“自从用了Spring AOP啊,事务管理真轻松啊,真轻松;事务管理代码没有了,脑不酸了,手不痛了,一口气全配上了事务;轻量级,测试起来也简单,嘿!”。不管从哪个角度看,轻量级声明式事务都是一件解放生产力的大好事。所以,我们“一直用它”。 不过,最近的一个项目里,却碰到了一个事务管理上的问题:有一个服务类,其一个声明了事务的方法,里面做了三次插入SQL操作,但是在后面出错回滚时,却发现前面插入成功了,也是说,这个声明了事务的方法,实际上并没有真正启动事务!怎么回事呢?难道Spring的声明式事务失效了? 【分析】 这个问题,表面上是事务声明失效的问题,实质上很可能是Spring的AOP机制实现角度的问题。我想到很久以前研究Spring的AOP实现时发现的一个现象:对于以Cglib方式增强的AOP目标类,会创建两个对象,一个事Bean实例本身,一个是Cglib增强代理对象,而不仅仅是只有后者。 我们知道,Spring的AOP实现方式有两种:1、Java代理方式;2、Cglib动态增强方式,这两种方式在Spring中是可以无缝自由切换的。Java代理方式的优点是不依赖第三方jar包,缺点是不能代理类,只能代理接口。 Spring通过AopProxy接口,抽象了这两种实现,实现了一致的AOP方式: 现在看来