Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring事务的传播机制及底层原理解析

Spring事务的传播机制及底层原理解析

作者头像
用户7353950
发布于 2024-05-20 07:38:10
发布于 2024-05-20 07:38:10
7780
举报
文章被收录于专栏:IT技术订阅IT技术订阅
Spring事务的传播机制是Spring框架中事务管理的重要组成部分,它定义了当一个事务方法被另一个事务方法调用时,两个方法之间的事务应该如何协调和传播。具体来说,Spring提供了七种事务传播行为:

1. REQUIRED (必须的,默认):

如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是最常见的选择,大部分业务场景都适用。

2. SUPPORTS (支持的):

如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。这种方法对于那些不需要事务也能正确执行,但在事务环境下运行也不会造成任何问题的方法特别有用。

3. MANDATORY (强制的):

必须在一个已存在的事务中执行,如果当前没有事务则抛出异常。

4. REQUIRES_NEW (需要新的):

总是创建一个新的事务,如果当前存在事务,则把当前事务挂起,新的事务结束后,再恢复之前被挂起的事务。

5. NOT_SUPPORTED (不支持):

不使用事务,如果当前存在事务,则将其挂起,直到该方法完成后再继续执行。

6. NEVER (绝不):

不允许在事务中执行,如果当前存在事务,则抛出异常。

7. NESTED (嵌套的):

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则如同 `REQUIRED` 一样,新建一个事务。嵌套事务可以独立于父事务进行提交或回滚,而不会影响父事务的状态。

通过在Service层方法上使用 `@Transactional` 注解,并设置其 `propagation` 属性,可以指定事务的传播行为,以满足不同场景下的事务管理需求。例如:

@Transactional(propagation = Propagation.REQUIRED)

public void someMethodInService() {

// ...

}

这样就能够确保在调用该方法时,遵循指定的事务传播规则。

Spring事务的传播机制底层原理涉及到Spring AOP(面向切面编程)和事务管理器的协同工作。当我们在服务方法上标注了`@Transactional`注解后,Spring通过动态代理机制(基于JDK Proxy或CGLIB)创建一个代理对象,该代理对象在方法调用前后插入必要的事务处理逻辑。 具体实现步骤如下: 1. 事务代理: - 当客户端调用服务方法时,实际上是调用Spring生成的代理对象的方法。 - 代理对象在方法调用前首先会通过Spring的事务管理器(如DataSourceTransactionManager、JpaTransactionManager等实现)来检查是否存在当前线程绑定的事务上下文。 2. 事务决策: - 根据`@Transactional`注解声明的事务传播属性,代理对象决定如何处理事务: - 创建新的事务(如`REQUIRES_NEW`) - 加入现有事务(如`REQUIRED`、`SUPPORTS`、`MANDATORY`) - 挂起现有事务(如`REQUIRES_NEW`、`NOT_SUPPORTED`) - 抛出异常(如`NEVER`) 3. 事务同步: -Spring利用Transaction

Synchronization

Manager来管理和维护事务相关的线程绑定信息,如使用ThreadLocal来存储事务状态和同步回调。 - 在事务开始、提交、回滚等关键节点,会触发相应的事务同步监听器,执行相应的清理和同步操作。 4. 事务边界管理: - 当方法调用结束后,代理对象会判断是否有未捕获的异常,如果有,根据事务的配置(rollbackFor、noRollbackFor)来决定是否回滚事务;如果没有异常,则提交事务。 5. 事务传播的具体实现: - 事务传播的实际动作由事务管理器来执行,比如当需要创建新事务时,事务管理器会调用连接(如JDBC Connection或Hibernate Session)的相关API来启动和管理事务。 通过上述机制,Spring能够在方法调用的前后透明地处理事务的开始、结束、回滚以及传播行为,使得开发者能够更加关注业务逻辑的实现,而不是底层的事务管理细节。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT技术订阅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring事务失效场景
如果@Transactional 没有特别指定,Spring 只会在遇到运行时异常RuntimeException或者error时进行回滚,而IOException等检查异常不会影响回滚。
科技新语
2022/12/22
4650
Spring事务失效场景
说说Spring事务的传播机制
最后琪姐说,修改了Spring的事务传播机制好了(应该是从默认的Required => Requires_New)。
春哥大魔王
2019/07/31
7160
面试官:Spring事务的传播行为有几种?
Spring事务支持两种方式,编程式事务和声明式事务,下面的例子使用声明式事务,即@Transactional注解的方式
Java识堂
2020/03/12
9160
Spring事务与非事务方法相互调用
序号 参数 含义 1 原子性(Atomicity) 事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。 2 一致性(Consistemcy) 事务前后,数据库的状态都满足所有的完整性约束。 3 隔离性(Isolation) 并发执行的事务是隔离的,一个不影响一个。通过设置数据库的隔离级别,可以达到不同的隔离效果 4 持久性(Durability) 在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
chenchenchen
2020/05/26
12K0
Spring高手之路24——事务类型及传播行为实战指南
定义:编程式事务是指通过显式的编程代码来管理事务的开始、提交和回滚。开发者需要手动控制事务的每个步骤。
砖业洋__
2024/11/23
2010
Spring高手之路24——事务类型及传播行为实战指南
【JavaEE进阶】Spring事务和事务传播机制
Spring 事务是 Spring 框架提供的一种机制,用于管理数据库操作或其他资源的一组相关操作,以确保它们在一个原子、一致、可靠和隔离的执行单元内进行。事务用于维护数据的完整性并支持并发访问数据库时的数据一致性。
xxxflower
2023/10/16
5520
【JavaEE进阶】Spring事务和事务传播机制
Spring事务—总结
事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于@Transactional 注解的方式。注释配置是目前流行的使用方式,因此本文将着重介绍基于@Transactional 注解的事务管理。
用户5325874
2020/01/16
3.4K2
Spring事务—总结
Spring 事务使用详解
什么是事务?根据 维基百科事务 介绍,数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。简单来说,事务就是将一系列操作当成一个不可拆分的执行逻辑单元,这些要么都成功,要么都失败。事务具有4个属性:原子性、一致性、隔离性、持久性。称为ACID特性。
Java技术编程
2020/05/21
1.2K0
关于Spring事务的传播特性
摘要:Spring事务管理基于底层数据库本身的事务处理机制,对数据库事务操作的一次封装,相当于把使用JDBC代码开启、提交、回滚事务进行了封装。其传播特性共有七个 正文: 事务的传播特性 Propagation.REQUIRED 方法被调用时自动开启事务,在事务范围内使用则使用同一个事务,如果当前线程中已经存在事务, 方法调用会加入此事务, 如果当前没有事务,就新建一个事务。 Propagation.REQUIRES_NEW 无论何时自身都会开启事务,这个事务不依赖于外部事务,它拥有自己的隔离
itliusir
2018/05/21
1.2K0
事务处理(一) - spring事务
Spring是通过org.springframework.transaction.PlatformTransactionManager接口来实现事务的管理。同时应对不同的场景,提供不同的PlatformTransactionManager实现类来实现管理事务。下面是常见的应用场景。
逝兮诚
2019/10/30
6990
Spring事务传播机制
本文主要是讲述Spring事务传播机制,也就是大家开发过程中多多少少会遇到的父方法调用子方法,或者A方法调用B方法时事务的传播机制问题,但是在开始讲Spring事务传播机制之前需要先讲一下Spring事务的几种传播类型,如图
六月的雨在Tencent
2024/03/28
1690
Spring事务传播机制
Spring事务专题(五)聊聊Spring事务到底是如何实现的
在上篇文章中我们一起学习了Spring中的事务抽象机制以及动手模拟了一下Spring中的事务管理机制,那么本文我们就通过源码来分析一下Spring中的事务管理到底是如何实现的,本文将选用Spring5.2.x版本。
程序员DMZ
2020/08/18
1.4K0
Spring事务专题(五)聊聊Spring事务到底是如何实现的
详解 Spring 事务传播性
首先,我们来了解 Spring 事务传播性到底是什么?Spring 事务传播性是指当多个含有事务的方法嵌套调用时,这多个方法处理事务的规则。比如这个图,当事务方法 A 调用事务方法 B 时,内层事务方法 B 会合并到外层调用者 A 方法的事务中,还是会新开启自己的事务。另外如果合并到外层事务,那么当内层方法回滚后,外层方法会不会回滚。
写bug的高哈哈
2025/02/09
1670
详解 Spring 事务传播性
Spring事务为什么会失效?
如果对AOP的实现不太熟悉的话可以看我之前的文章,或者到我网站www.javashitang.com上查看系列文章
Java识堂
2022/05/19
6330
Spring事务为什么会失效?
Spring事务和事务传播机制(2)
在Spring框架中,事务管理是一种用于维护数据库操作的一致性和完整性的机制。Spring事务管理提供了灵活的方式来处理事务,包括事务的创建、提交、回滚以及事务的传播行为。
终有救赎
2023/10/16
3120
Spring事务和事务传播机制(2)
面试官:说说Spring中的事务传播行为
在开发中,相信大家都使用过Spring的事务管理功能。那么,你是否有了解过,Spring的事务传播行为呢?
Happyjava
2019/07/16
9520
面试官:说说Spring中的事务传播行为
Spring事务传播机制(最全示例)
我们在使用Spring框架进行开发时,经常在service层写很多方法,而且这些方法都是带事务的,那么Spring的事务怎么在多个方法之间传播呢?今天我们就仔细聊一聊。
小忽悠
2024/09/24
1.5K0
Spring事务传播机制(最全示例)
揭秘Spring事务:让你的数据库操作不再出错!
在企业级 Java 应用中,数据库事务是保证数据一致性和完整性的基石。Spring 框架提供了强大且灵活的事务管理能力,使得开发者可以使用声明式或编程式方式来控制事务边界。然而,很多开发者在实际项目中常常会遭遇事务不生效、回滚不正确、死锁、性能下降等问题,究其原因,多是由于对事务原理和配置细节了解不足。
javpower
2025/07/12
1000
揭秘Spring事务:让你的数据库操作不再出错!
spring @Transactional 事务注解
value这里主要用来指定不同的事务管理器;主要用来满足在同一个系统中,存在不同的事务管理器。比如在Spring中,声明了两种事务管理器txManager1, txManager2.
庞小明
2019/05/25
1.9K0
Spring事务传播机制的应用场景和解决方法
在实际项目中,我们可以使用Spring事务传播机制来管理事务并解决可能遇到的问题。
一凡sir
2023/11/07
6440
Spring事务传播机制的应用场景和解决方法
相关推荐
Spring事务失效场景
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档