Spring 如何处理不同的事务传播行为和隔离级别?

Spring 中的事务 和 事务的传播机制 事务传播机制是指定事务在方法调用之间如何传播和影响的机制,通过定义事务的传播行为,控制事务在不同方法之间的创建、挂起、恢复和回滚操作。REQUIRED(默认):如果当前存在事务,则加入到当前事务中,如果没有事务,则创建一个新的事务。SUPPORTS:如果当前存在事务,则加入到当前事务中,如果没有事务,则以非事务的方式执行。MANDATORY:必须在一个已存在的事务中执行,否则抛出异常。REQUIRES_NEW:每次都会创建一个新的事务,如果当前存在事务,则将当前事务挂起。 阅读详情

Spring 通过一个精密且强大的机制来处理不同的事务传播行为和隔离级别,其核心是面向切面编程 (AOP)、平台事务管理器 (PlatformTransactionManager) 和 事务同步管理器 (TransactionSynchronizationManager) 的协同工作。

Spring 事务处理的核心架构

当 Spring 容器检测到一个 bean 中有 @Transactional 注解时,它不会直接返回该 bean 的实例,而是创建一个代理对象。 所有对该 bean 中带有 @Transactional 注解的方法的调用都会被这个代理拦截,从而进入事务处理的流程。

这个流程的主要参与者包括:

  • AOP 代理 (AOP Proxy):这是事务管理的入口。它拦截方法调用,并启动事务管理的逻辑。
  • 事务拦截器 (TransactionInterceptor): 作为 AOP 的具体实现,它在方法执行前后添加事务处理逻辑,例如开始事务、提交或回滚。
  • 平台事务管理器 (PlatformTransactionManager): 这是 Spring 事务管理的核心接口,定义了获取、提交和回滚事务等基本操作。 Spring 为不同的持久化技术(如 JDBC, JPA, Hibernate)提供了具体的实现。 事务行为的实际执行者是 PlatformTransactionManager。
  • 事务同步管理器 (TransactionSynchronizationManager): 这是一个关键的工具类,它使用 ThreadLocal 变量来管理和同步当前线程的事务资源(如数据库连接)和状态(如是否存在激活的事务)。 这确保了在同一个线程中的事务操作能够正确协调。

事务传播行为的实现

事务传播行为定义了当一个事务方法被另一个事务方法调用时,事务应该如何表现。 这是通过 PlatformTransactionManager 的 getTransaction() 方法,并结合 TransactionSynchronizationManager 来实现的。

以下是关键传播行为的实现流程:

  1. 方法调用与拦截: 当一个被 @Transactional 注解的方法被调用时,AOP 代理会拦截该调用。

  2. 获取事务: TransactionInterceptor 会调用 PlatformTransactionManager 的 getTransaction() 方法来获取一个事务状态对象。

  3. 判断当前事务状态: PlatformTransactionManager 的实现类会首先通过 TransactionSynchronizationManager.isActualTransactionActive() 来检查当前线程是否已经存在一个激活的事务。

  4. 根据传播行为决策:

    • REQUIRED (默认): 如果当前存在事务,则直接加入该事务,共享同一个物理连接。如果没有,则创建一个新的事务。
    • REQUIRES_NEW: 无论当前是否存在事务,都会创建一个全新的事务。如果当前已有事务,PlatformTransactionManager 会先将当前事务挂起(暂停),然后创建一个拥有独立连接的新事务。当新事务结束后,再恢复之前被挂起的事务。
    • NESTED: 如果当前存在事务,并且底层的事务管理器支持保存点(Savepoint),它会创建一个保存点。内部的嵌套事务可以独立于外部事务进行回滚,而不会影响到外部事务。如果没有活动事务,其行为与 REQUIRED 相同。
    • SUPPORTS: 如果当前存在事务,则加入;如果没有,则以非事务方式执行。
    • NOT_SUPPORTED: 总是以非事务方式执行。如果当前存在事务,会将其挂起。
    • MANDATORY: 强制要求当前必须存在一个事务,否则会抛出异常。
    • NEVER: 强制要求当前不能存在事务,否则会抛出异常。

隔离级别的实现

事务隔离级别定义了一个事务中的修改对其他并发事务的可见性。 隔离级别的设置发生在创建 新 事务的时候。

  • 设置时机: 隔离级别的信息包含在事务定义中。当 PlatformTransactionManager 开始一个新事务时(例如,对于 REQUIRED 传播行为且当前无事务,或对于 REQUIRES_NEW),它会将指定的隔离级别应用到底层资源上。

  • 具体实现:

    • 对于使用 JDBC 的情况(如 DataSourceTransactionManager),在获取一个新的数据库连接后,会调用 connection.setTransactionIsolation(isolationLevel) 方法来设置该连接的隔离级别。
    • 当隔离级别设置为 DEFAULT 时,Spring 会使用数据库驱动或数据源配置的默认隔离级别。
  • 重要提示: 隔离级别只在开启新事务时才生效。如果一个方法加入了已有的事务(例如,REQUIRED 传播行为),它将沿用现有事务的隔离级别,而其自身设定的隔离级别将被忽略。

总结

Spring 通过 AOP 代理拦截事务性方法调用,利用 PlatformTransactionManager 作为策略接口来执行具体的事务操作,并借助 TransactionSynchronizationManager 在线程级别上管理事务状态和资源。这种设计将复杂的事务控制逻辑与业务代码解耦,使得开发者可以通过简单的 @Transactional 注解来灵活地控制事务的传播行为和隔离级别,从而构建出稳定、可靠的应用程序。

避坑指南:ROS2 Humble摄像头标定常见错误排查(从‘CALIBRATE’按钮不变绿到保存文件找不到) 本文详细解析了ROS2 Humble环境下摄像头标定的常见问题及解决方案,从CALIBRATE按钮不变绿到标定文件保存失败等疑难杂症。提供硬件准备、参数设置、实时诊断到结果验证的全流程指导,特别针对Ubuntu2204系统和usb_cam驱动的兼容性问题给出实用建议,帮助开发者高效完成内参标定。 阅读详情

相关推荐

基于R语言的DICE模型实践技术应用;预测不同减排路径下的经济增长、碳排放量、气候变化程度以及社会福利变化

DICE模型是一个动态综合气候经济模型,由诺贝尔经济学奖得主William Nordhaus开发,用于评估气候变化对经济的影响以及不同减排政策的经济成本和效益。以下是一个关于DICE模型在气候变化影响评估中的实际应用案例,结合R语言代码进行讲解。

KY_chenzhao的博客 867

Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

qq_53317005的博客 5206

STM32+ESP8266接入OneNet物联网平台全流程

MQTT协议是物联网设备与云平台通信的主流轻量级消息传输标准,其发布/订阅模型天然适配嵌入式资源受限场景;OneJSON作为中国移动OneNet平台定制的数据格式,在标准JSON基础上精简Schema、降低解析开销,显著提升STM32等MCU的处理效率。该技术组合兼顾安全性、低功耗与工程可量产性,广泛应用于环境监测、智能仪表、工业传感器等远程数据采集系统。实际落地需协同完成云平台物模型定义、Token动态认证、MQTT Topic严格构造、AT指令可靠交互及单总线传感器数据融合等关键环节。本文以DS18B2

u5v6w7的博客 1120

事务-1 事务隔离级别和Spring事务传播机制

本文介绍事务的基础篇:包括事务的概念和性质、MySql的隔离级别、Spring事务传播机制等,本文偏向于实践操作。

shengyu 5474

倍福 MODBUS TCP/IP通信

(*默认字符串80字节,此处声明为255字节,可以一次性传42个UINT数据.5位整数加一个空格,即每个数据6字节*)(*---------------------------------------- 以下为用户程序 ----------------------------------------*)(*读回并换算后的值*)(*准备写到PLC的值*)(*用于比较两次读回的值相差多少,以估计通讯的速度, Act_CalcDiff*)(*用于切换读和写,Act_Protocal*)

qq_33280096的博客 1367

Linux CentOS7文件系统(/dev/var)的容量扩充

原因是之前安装docker后,再想安装Nessus,系统说home、var文件系统的内存都不够。

JHoanna的博客 3225

学习笔记——Spring(7)事务的传播行为和隔离级别

事务的传播行 如果一个方法(事务方法或非事务方法)里面调用了其他的方法(事务方法或非事务方法),那么Spring是怎样处理的呢? 这就涉及到Spring事务的传播行为,@Transactional注解中可以通过设置propagation属性来管理事务的传播行为。 propagation属性有以下几种设置,分别对应不同的事物传播行为: Propagation.REQUIRED 支持当前事务...

hxr_lzy的博客 292

VTK四视图联动避坑指南:解决vtkImagePlaneWidget窗宽窗位同步与切片序号更新的那些坑

本文详细解析了VTK四视图联动开发中的关键技术点与常见问题,包括切片位置同步、窗宽窗位同步的实现原理及回调机制设计。针对开发中遇到的回调事件不触发、渲染性能低下等问题,提供了实用的解决方案和优化技巧,帮助开发者高效构建医学影像和科学可视化应用。

weixin_42638178的博客 391

spring事务隔离和传播机制的简单理解

一、spring事务的传播机制(HibernateTransactionManager)      1)、 如果当前没有事务,就新建一个事务;如果已存在一个事务,就加入到这个事务中。     2)、SUPPORTS" /> 支持当前事务,如果当前没有事务,以非事务方式执行。     3)、MANDATORY" />使用当前事务,如果当前没有事务,则抛出异常。     4)、

cnsd_liuliu的博客 2519

21天教你学会PCIe专栏(21)--项目实例:构建一个基于 PCIe 的 NVMe SSD 阵列存储系统

构建一个高性能的 NVMe SSD 阵列存储系统,利用 PCIe 连接多块 NVMe SSD,实现高带宽和低延迟的数据存储。该系统将支持多种存储配置,如 RAID 0、RAID 1 和 RAID 5,以满足不同的性能和可靠性需求。通过上述步骤,你可以构建一个基于 PCIe 的 NVMe SSD 阵列存储系统。这个系统能够提供高带宽和低延迟的数据存储,并支持多种 RAID 配置以满足不同的性能和可靠性需求。

xiaoheshang_123的博客 200

YOLOv11 改进 - 注意力机制 | EMA (Efficient Multi-Scale Attention) 高效多尺度注意力:跨空间学习与多分支协同增强特征表征,优化多尺度目标检测

本文介绍了高效多尺度注意力(EMA)模块及其在YOLOv11中的结合应用。现有注意力机制在通道维度缩减时可能影响深度视觉表示,EMA模块通过结合通道和空间信息、采用多尺度并行子网络结构等创新点,实现了高效的多尺度注意力机制。其基本原理包括通道和空间注意力结合、多尺度并行子网络设计等。在多个流行基准数据集上的实验表明,该模块能有效提高特征表示能力。我们将EMA集成进YOLOv11,实验证明改进后的模型在目标检测任务中性能优越,具有广泛应用前景

魔改工程师的博客 1292

关于Spring事务管理之默认事务间调用问题

这里用到的事务配置为注解方式, 目前我们项目开发过程中使用配置文件方式, 一般为以下方式。这种方式的事务配置, 更容易引起问题。没有接受到里面抛出的异常, 方法继续执行, 执行结束后, 事务提交。, 默认事务再被调用时, 如外层方法无事务, 自身会新启事务。由事务的传播行为我们知道, 如果将方法配置为默认事务。的时候检测到事务被标记为回滚, 与预期不符, 也就是。, 作为一个独立事务来执行. 由此存在一个问题。出现异常后它将事务标记为回滚。的事务回滚依托在异常之上, 当。, 之后再被调用的方法。

程序猿进阶 2925

【UE5】RTS游戏的框选功能+行军线效果实现

步骤: 一、项目准备; 二、框选NPC并移动到指定地点; 三、框选效果; 四、行军线效果

ChaoChao66666的博客 2378

Spring 事务的传播机制,看这篇就够了!

点击上方 "程序员小乐"关注公众号,星标或置顶一起成长每天凌晨00点00分,第一时间与你相约每日英文You will meet two kinds of people in life: ones who build you up and ones who tear you down. But in the end, you'll thank them both.生命中你会遇到两种人:一种是鼓励...

吧主 1522

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spring事务原理以及传播说明

一:事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。 下面简单地介绍下,注解方式为例子 配置文件开启注解驱动,在相关的类和方法上通过注解@Transactional标识。 spring 在启动的时候会去解析生成相关的bean,这时候会查看拥有相关注解的类和方法,并且为这些类和方法生成代理,并根据@Transaction的相关参数进行相关配置注入,这样就在代理中为我们把相关的事务处理掉了(开启正常提交事务,异常回滚事务)。 真

wszhm123的博客 246

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring 事务和事务传播机制

这篇博客主要介绍了Spring的事务和事务传播机制

qq_54469537的博客 1988

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Spring事务与事务传播机制

Spring 事务传播机制定义了多个包含了事务的⽅法,相互调用时,事务是如何在这些⽅法间进⾏传递的。1.同类中:无事务方法 嵌套 事务方法 ,事务不生效,因spring 中事务基于代理实现。详细原理请见4.5.22.同类中:REQUIRES 嵌套 REQUIRES_NEW ,REQUIRES_NEW不生效,加入到REQUIRES事务中,原理同上。

weixin_60778429的博客 1403

java spring 事务传播_spring事务传播机制实例讲解

天温习spring的事务处理机制,总结如下对于SQL事务的概念以及ACID性质,可以参见我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011spring的管理的事务可以分为如下2类:逻辑事务 在spring中定义的事务通常指逻辑事务,提供比物理事务更抽象,方便的事务配置管理,但也基于物理事务物理事务 特定于数据库的事务spring中支持一下2中...

weixin_39574720的博客 589

spring事务 及 7种传播行为

隔离级别:读未提交(read-uncommitted),不可重复读(read-committed),可重复读(repeatable-read),串行化(serializable); 传播行为:PROPAGATION_REQUIRED ,PROPAGATION_SUPPORTS,PROPAGATION_MANDATORY,PROPAGATION_REQUIRES_NEW,PROPAGATION_NOT_SUPPORTED,PROPAGATION_NEVER,PROPAGATION_NESTED

zs1972551648的博客 396

Spring的传播行为、隔离级别

spring的传播行为指的是当多种事务同时存在的时候,spring如何处理这些事务的行为。 PROPAGATION_REQUIRED:如果当前没有事务就创建一个事务,如果当前有事务就加入该事务。这是最常见的配置。 PROPAGATION_SUPPORTS:如果当前存在事务就加入该事务,如果当前没有事务就以非事务执行。 ROPAGATION_MANDATORY:如果当前存在事务就加入该事务,如果当前...

NIUBILISI的博客 244

spring 五个事务隔离级别和七个事务传播行为

Spring在TransactionDefinition接口中定义了五个不同的事务隔离级别 ISOLATION_DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应  ISOLATION_READ_UNCOMMITTE...

ITQingChun 156

深入理解 Spring 事务原理

一、事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 1.获取连接 Connection con = DriverManager.getConnection() 2.开启事务con.setAutoCommit(true/false); 3.执行CRUD 4.提交事务/回滚事务 con.commit() / con.rollback(); 5.关闭连接 conn.close(

qq_34156949的博客 5811

Spring的事务处理

方便使用的IDEA设置-b站 主要内容: 背景主题、鼠标修改代码字体大小设置、鼠标悬浮提示(关于类的介绍)、自动导包设置、方法间分隔符、忽略大小写提示、取消单行显示tabs(类文件太多文件被隐藏,多行显示)、设置字体行间距、file header头部信息、设置项目文件编码、设置自动编译、版本控制、插件、快捷键等。 ...

RitaAndWakaka的博客 1247

【Spring事务】事务和事务传播机制

介绍了Spring的事务的机制,一个是手动操作模式,一个是注解模式.另外还介绍了Spring的事务传播机制

weixin_51574797的博客 574

Spring事务源码解析

主要分为两部分:第一部分简单介绍Spring事务相关的一些基本概念;第二部分详细分析了Spring事务整个执行流程的源码,包括事务的开启、提交、回滚等

qq_34826261的博客 1498

spring的事务传播机制和隔离级别和回滚机制

什么是事务的传播机制 指的是一个事务方法被另一个事务方法调用的时候,这个事务方法应该如何进行

qq_46134095的博客 457
上一篇: Spring 事务传播行为和隔离级别是如何实现的?
下一篇: WAF(Web Application Firewall,Web 应用防火墙)的作用
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值