自己遇到的事务失效情况及解决方法

这篇博客探讨了在Spring中使用@Transactional注解时遇到的事务失效问题。当一个有事务的方法直接调用另一个有事务的方法时,由于缺少代理,事务可能不会生效。这种情况可以通过在类外部装配自身并使用装配的对象来调用方法来解决。同时,文章讨论了不同事务传播行为的影响,以及在异常处理中事务回滚的条件。总结了解决此类问题的关键在于理解Spring事务的代理机制和传播行为。

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

自己遇到的事务失效情况 (直接调用的意思是this.B()的形式或者B()形式调用) 

同一个类中

1、A方法没有加事务,B方法加了事务,在A方法直接调用B方法,B方法出现异常了,B方法不会回滚

原因:spring在扫描包的时候会扫描到@Transactional注解的方法,spring的回滚是用过代理模式生成的,如果是一个不带事务的方法调用该类的带事务的方法,直接通过this.xxx()调用,而不生成代理事务,所以事务不起作用

 

2、a方法默认传播行为即Propagation.REQUIRED,b方法propagation = Propagation.REQUIRES_NEW传播行为 ,a方法和b方法都有事务,在a方法直接调用b方法,在a中将b的异常捕获了,b方法没有回滚

原因:虽然spring可以将这两个方法的注解扫描到产生代理对象,但是在A方法中直接调用B方法,调用方法是真实对象调用的,而不是代理对象调用的,所以B方法的事务是失效的,事务不不会回滚

 

解决方法可以在类中将本类装配进来,用装配进来的对象调用B方法

例如

@Autowired
private UserLoginService userLoginService;

userLoginService.B()

 

补充:

方法a上有事务,但在方法a没有增删改操作,方法b没有事务,在方法b里有增删改操作 (方法a执行结束后事务才会提交或者回滚)

场景:方法a调用方法b,当b有异常,b会回滚;(这里不管是直接调用即b()或者this.b() 还是用service.b() 调用数据库都会回滚)

场景:方法a调用方法b,当a有异常,b会回滚;(这里不管是直接调用即b()或者this.b() 还是用service.b() 调用数据库都会回滚)

 

方法a上没有事务,方法b也没有事务,在方法b里有增删改操作

场景:方法a调用方法b,b操作数据库语句一结束,数据就会更新,后续当b有异常,b不会回滚;(这里不管是直接调用即b()或者this.b() 还是用service.b() 调用数据库都不会回滚)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值