spring事务

aop在一个项目的开发中,为spring的事务折腾了一下,主要是注解后测试事务总是无法回滚,刚开始以为那里配制错了,上网到处寻找,都是这样配制的,让我有点晕。最后不得已把spring的源码打开看了一下,发现掉到陷井里去了!也许是对spring了解的不深,不过还是把自己的解决方案分享出来!欢迎拍砖。

  

我们知道,SpringAOP实现方式有两种:1Java代理方式;2Cglib动态增强方式,这两种方式在Spring中是可以无缝自由切换的。Java代理方式的优点是不依赖第三方jar包,缺点是不能代理类,只能代理接口。

Spring通过AopProxy接口,抽象了这两种实现,实现了一致的AOP方式:

AOP

 

现在看来,这种抽象同样带了一个缺陷,那就是抹杀了Cglib能够直接创建普通类的增强子类的能力,Spring相当于把Cglib动态生成的子类,当普通的代理类了,这也是为什么会创建两个对象的原因。下图显示了SpringAOP代理类的实际调用过程:

 调用过程

因此,从上面的分析可以看出,methodB没有被AopProxy通知到,导致最终结果是:被SpringAOP增强的类,在同一个类的内部方法调用时,其被调用方法上的增强通知将不起作用。

 

而这种结果,会造成什么影响呢:

1:内部调用时,被调用方法的事务声明将不起作用

2:换句话说,你在某个方法上声明它需要事务的时候,如果这个类还有其他开发者,你将不能保证这个方法真的会在事务环境中

3:再换句话说,Spring的事务传播策略在内部方法调用时将不起作用。不管你希望某个方法需要单独事务,是RequiresNew,还是要嵌套事务,要Nested,等等,统统不起作用。

4:不仅仅是事务通知,所有你自己利用Spring实现的AOP通知,都会受到同样限制。

 

事务不回滚的原因找到了

解决方法其实非常简单,只要避开Spring目前的AOP实现上的限制,分开成两个类,或者直接在方法里使用编程式事务,那么一切OK

 理想的代理

 

其实理想中的AOP实现,应该是下面这样:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值