spring 事物 关于在同一个类中一个方法调用另一个方法,事物的传播行为会失效

spring 提供了强大的事物管理机制,直接到在方法或者类上加@Transactional,也可以使用XML配置事物。

在一次的测试中发现当一个方法在同一个类被其它方法调用的时候,导致事物的传播行为不生效。

具体说明:

类结构:

public class Demo {

	public void methodA() {
		this.methodB();
	}
	
	
	public void methodB() {
		
	}
	
}

1、如果在methodA中加入:@Transactional,mehodB不加@Transactional,那么调用methodA,methodA的事物会生效,因为methodA默认的propagation为PROPAGATION_REQUIRED,此时methodB会加入到methodA中

2、如果methodA与methodB都加上@Transactional,那么调用methodA,methodA的事物会生效,此时和 1 中情况一样,事物会生效,也是由于methodB的事物会加入到methodA中,但是,其实methodA中通过this.methodB()的调用是没有触发spring 的事物,原因会统一讲解。

3、如果methodA配置@Transactional,methodB配置@Transactional( propagation = Propagation.REQUIRES_NEW ),那么调用methodA,如果methodA出现异常,根据spring的事物传播行为,其实methodB应该是入库才对,但是我测试发现根本没有生效,一样是全部回滚。

原因解释:

spring的事物管理通过AOP代理来实现, 根据aop的思想,不可能在具体类Demo上直接处理事物,而是通过代理类来处理,代理类在调用具体类的方法来实现,根据上面的情景methodA通过this调用methodB,那么此时相当于调用methodB时是没有经过代理类的调用,因此spring无法对事物的传播行为做处理。

下面CGLIB生成的代理对象反编译的类文件:


其实JDK代理,也是类似的原理,不同的是,JDK代理是通过实现接口来重新生成代理对象,通过反射调用被代理类的方法




  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值