Spring的事务实现原理是什么?能聊聊你对事务传播机制的理解吗?

本文探讨了Spring事务的实现原理,通过AOP在方法执行前后管理事务的开启与提交或回滚。同时深入解析了事务的传播机制,包括Propagation.REQUIRED、Propagation.SUPPORTS、Propagation.MANDATORY、Propagation.REQUIRES_NEW、Propagation.NOT_SUPPORTED、Propagation.NEVER和Propagation.NESTED等不同模式,并结合面试题解释了它们在实际场景中的应用。对于要求方法A出错只回滚自身,而不影响方法B的情况,推荐使用Propagation.REQUIRES_NEW。若希望在方法A出错时,方法B的改变也能回滚,可以采用Propagation.NESTED进行嵌套事务处理。

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

事务的实现原理

加一个@Transactional注解,此时spring会使用AOP思想,对你的这个方法在执行之前,先去开启事务,执行完毕之后,根据你方法是否报错,来决定回滚还是提交事务

事务传播机制

一个加了@Transactional注解的方法,调用另外一个加了@Transactional注解的方法,这个事务是如何传播的?

(1)Propagation.REQUIRED(默认值,不加的时候也默认为Required)常用

如果调用我这个方法的时候,没有事务,则创建一个新的事务。如果已经有事务了,那么把他加到现有的事务中

(2)Propagation.SUPPORTS少见

方法B改成SUPPORTS:如果单独去调用时,不会开启事务。必须是开启事务的方法A去调用这个方法

支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行

(3)Propagation.MANDATORY少见

方法B改成MANDATORY:必须是开启事务的方法去调用方法B,不然报错

支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常

(4)Propagation.REQUIRES_NEW也会有

方法B改成REQUIRED_NEW:强制开启新的事务,AB两个事务互不影响

创建新事务,无论当前存不存在事务,都创建新事务

(5)Propagation.NOT_SUPPORTED少见

强制要求以非事务的方式执行,如果当前存在事务,则把当前事务挂起

(6)Propagation.NEVER少见

以非事务方式执行,如果当前存在事务,则抛出异常

(7)Propagation.NESTED事务的嵌套,会用,但不经常用

如果方法A抛出异常,会回滚全部代码。如果方法B中抛出异常,则会回滚到之前的savepoint

嵌套事务:外层的事务如果回滚,会导致内层的事务也回滚;但是内存的事务如果回滚,仅仅是回滚自己的代码

面试题

1.我们现在有一段业务逻辑,方法A调用方法B,我希望的是如果说方法A出错了,此时仅仅回滚方法A,不能回滚方法B?

必须用REQUIRES_NEW,传播机制,让他们俩的事务是不同的

2.方法A调用方法B,如果出错,方法B只能回滚他自己,方法A可以带着方法B一起回滚?

NESTED嵌套事务

这种时候要告诉面试官,要用哪种传播机制来做(见上面7中传播机制)

【评论区】

1、他人总结

(1)事务的传播,是用于Servcie层相互调用时,解决事务作用范围的一个机制

(2)主要分为三大类:A与B要处于同一个事务,A与B不能处于同一事务,最后就是适用于嵌套事务模型的nexted

(3)具体的场景使用场景需要根据业务场景选择

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值