Spring 嵌套事物 失效2

本文详细探讨了在Java中使用Spring框架进行事务管理时,不同事务传播行为如何影响方法间调用的效果。特别是针对同一类内方法调用时,由于AOP代理机制,导致的事务传播行为与预期不符的现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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无法对事物的传播行为做处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值