- 作者:老汪软件技巧
- 发表时间:2024-09-16 21:02
- 浏览量:
一、前言
想必在大家学习Spring事务的过程中一定遇到过这样一个概念:事务传播机制。有过数据库学习经验的朋友在遇到这样一个概念的时候一定是满脸的问号:事务还能传播?数据库里面好像也没有这个东西啊?下面我们就来具体了解一下Spring当中的事务传播机制到底是什么以及到底是怎么传播的。
二、什么是事务传播机制基本概念
事务传播机制是指当一个事务性方法调用另一个事务性方法时,事务如何在它们之间传播、共享或独立。这在处理嵌套方法调用时非常重要,因为不同的业务场景对事务的需求不同,有时我们希望多个方法共享同一个事务,有时则希望它们各自有独立的事务。事务传播机制可以让开发者灵活地控制事务边界。
使用场景
在了解完事务传播机制的基本概念之后,我们再来解决一下文章一开始出现的问题:数据库当中是否有事务传播机制的概念?答案是否定的,数据库当中是没有事务传播机制这样一个概念的。那事务传播机制到底是用在什么地方的呢?
其实在了解完上面的基本概念之后这个问题的答案已经跃然纸上了:事务传播机制真正使用的地方应该是整个系统中的应用层。对于底层数据服务、资源服务来说并不会存在嵌套的方法调用。相比上层的应用层业务系统而言,底层的数据服务只需要完成对应数据的增删改查操作即可,数据服务之间并不会有交互,各自服务的提供相对独立。简单来说,我MySQL更新成功与否和你PostgreSQL是否更新成功毫无关系,我不关心你,你也不用关心我,各自安好即可。而对于上层应用来说就当甩手掌柜这件事情是完全不可行的,它必须去关心不同资源的事务处理情况。由于这些事务可能会分散在不同方法当中,在进行嵌套调用的时候,这些事务哪些需要合并执行、哪些要独立执行都是需要考虑的问题,也就是说需要一套机制来去定义不同场景下事务处理行为的边界,由此也就诞生了事务传播机制。
三、Spring的事务传播机制
从上面的概念当中我们可以了解到事务的传播机制本质上是基于当前事务的状态来制定的事务处理行为边界的判断标准。以下就是常见的事务状态以及对应的事务处理行为:
需要注意的是,有些地方会使用“非事务方式”来去描述不需要Spring进行额外事务控制的情况,这里的“非事务”或“不支持事务”并不是指数据库层面的本地事务就不存在了,而是指不需要或者不能使用Spring进行额外的事务管理,大家在学习和使用的过程中还是需要厘清这里面的区别。
基于上面展示的事务处理场景,Spring提供了六种事务传播行为来去管理这些事务边界,分别是:PROPAGATION_REQUIRED(默认值)、PROPAGATION_REQUIRES_NEW、PROPAGATION_SUPPORTS、PROPAGATION_NOT_SUPPORTED、PROPAGATION_MANDATORY、PROPAGATION_NEVER。
看到这里有朋友可能要喷闲宇了,明明Spring当中提供了七种传播行为,为什么到你这里只有六种。不要慌,容我慢慢道来。这里将第七种传播行为单独摘出来的原因是在于在这个传播行为当中定义了一种非常特别的概念:嵌套事务。
嵌套事务(Nested Transactions) 是指在一个已存在的事务(通常称为“父事务”)中创建一个或多个新的事务(称为“子事务”)。嵌套事务的特点在于它们与父事务共享相同的事务边界,但它们又具有自己独立的回滚范围。
嵌套事务具备这样两个特点:共享事务边界和独立的回滚范围。
是不是感觉上面的概念看起来还是有点费劲,让我们举个简单的例子:
在上面例子当中,我们希望A方法当中的保存数据逻辑能够影响到B方法当中的日志保存逻辑,但是不希望B方法当中的日志保存逻辑影响到A方法的保存数据逻辑。也就是说在A方法执行的时候需要开启两个事务,一个从属于A方法,一个从属于B方法,在A方法结束时需要提交两个事务,当A方法执行发生异常时需要对两个事务都发起回滚操作,但是B方法执行异常时只需要对从属于自己的事务发起回滚即可,并不能影响A方法的正常执行。也就是父会影响子,但是子不能影响父的场景,这个时候就需要我们嵌套事务了。
至此,加上处理嵌套事务的PROPAGATION_NESTED,Spring的其中事务传播行为就全部讲完了。需要注意的是,在上面的例子当中闲宇使用的是@Transactional声明式事务方法,但是这并不意味着在编程式事务方法当中事务传播机制就不可用了,我们仍然是可以使用它的。
四、Spring事务传播机制的局限性
和之前讨论Spring事务的局限性一样,Spring事务传播机制也同样存在无法解决分布式场景下事务一致性的问题。事务传播机制主要用于管理单个应用程序中的本地事务,尤其是当多个方法之间需要共享或独立事务时,它提供了灵活的控制。然而,在分布式系统中,涉及多个独立的服务、数据库、消息队列等不同资源管理器时,传统的事务传播机制无法满足跨服务、跨资源的全局一致性需求。
也基于这样一个原因,我们在实际使用Spring的事务管理能力时一定要弄清楚场景,这样才能制定出正确的技术方案。
五、总结
在全面了解了Spring的事务管理能力之后我们可以发现,其实我们学习这些框架的原理和机制最主要要的还是为了去更好地使用它们。只有明白了这些框架的能力边界和使用场景我们才能制定出更符合业务的技术方案,在进行问题处理时才能更迅速地定位根源。
最后,祝大家身体健康,心想事成,早日财富自由~~
p.s. 台风天大家出行注意安全,没事就不要出门了。