Spring事务的七种传播行为
Spring事务的七种传播行为
- 1.事务的传播行为是什么?
- 2.具体传播行为
- 2.1 REQUIRED ,默认,存在事务则加入该事务,不存在则新建一个事务
- 2.2 REQUIRES_NEW,每次新开启事务,新老事务相互独立
- 2.3 NESTED, 存在事务则嵌套当中执行,不存在事务则新建一个事务
- 2.4 SUPPORTS,存在则支持当前事务,不存在事务则以非事务执行。
- 2.5 NOT_SUPPORTED, 以非事务的方式运行,存在事务则把当前事务挂起
- 2.6 MANDATORY,强制事务执行,不存在事务则抛出异常。
- 2.7 NEVER,以非事务来运行,存在事务则抛出异常。
- 3.事务失效的场景
- 3.1 非public修饰的方法
- 3.2 自身调用
- 3.3 被 final、static 关键字修饰的类或方法
- 3.4 没有被 Spring 管理
- 3.5 数据库不支持事务
- 3.6 异常被捕获
- 3.7 异常类型错误
- 3.8 多线程调用
1.事务的传播行为是什么?
事务的传播行为就是指多个声明了事务的方法相互调用的时候存在事务嵌套的问题,事务在方法中如何传播。
比如说:methodA()调用methodB(),两个方法都开启了事务,那么methodB()是开启了一个新事物,还是继续在methodA()这个事务中执行呢?就取决与事务的传播行为。
所以,Spring 为了解决这个问题,定义了 7 种事务传播行为。
传播行为 | 含义 |
---|---|
REQUIRED | 默认的Sring事务传播级别,如果当前事务存在,则加入该事务,如果不存在 就新建一个事务。 |
REQUIRES_NEW | 不管是否存在事务,都会新开启一个事务,新老事务相互独立;外部事务抛出异常回滚不会影响内部事务的正常提交。 |
NESTED | 如果当前存在事务,则嵌套在当前事务中执行,如果当前没有事务,则新建一个事务,类似与REQUIRE_NEW。 |
SUPPORTS | 表示支持当前事务,如果当前不存在事务,则以非事务的方式执行。 |
NOT_SUPPORTED | 表示以非事务的方式运行,如果当前存在事务,则把当前事务挂起。 |
MANDATORY | 表示强制事务执行,若当前不存在事务,则抛出异常。 |
NEVER | 表示以非事务的方式来运行,如果当前存在事务,则抛出异常。 |
2.具体传播行为
2.1 REQUIRED ,默认,存在事务则加入该事务,不存在则新建一个事务
当前存在事务则加入该事务,不存在事务则新建一个事务
示例代码:
@Override@Transactional(propagation = Propagation.REQUIRED)public void methodA() {userMapper.updateById(new TbUser(2, "李开", 33, 1)); // 更新用户methodB(); //调用methodB()}@Override@Transactional(propagation = Propagation.REQUIRED)public void methodB() {userMapper.updateById(new TbUser(3, "李福", 22, 1)); //更新用户int a = 1/0; // 发生异常System.out.println("=====执行 methodB 完成=====");}
结论:用户数据不会发生变化。当调用methodA()上下文没有事务就会开启一个事务,当执行methodB(),因为已经存在一个事务,methodB()不会开启新事务,而是加入到methodA()事务中执行。当‘int a = 1/0;’执行报错就会回滚methodA事务,而methodB也在methodA事务中,所有都会回滚。
2.2 REQUIRES_NEW,每次新开启事务,新老事务相互独立
不管是否存在事务,都会新开启一个事务,新老事务相互独立;外部事务抛出异常回滚不会影响内部事务的正常提交。
2.3 NESTED, 存在事务则嵌套当中执行,不存在事务则新建一个事务
如果一个活动的事务存在,则运行在一个嵌套事务中,如果没有活动事务,则按照PROPAGATION_REQUIRED属性执行。
2.4 SUPPORTS,存在则支持当前事务,不存在事务则以非事务执行。
如果存在事务则支持当前事务,如果不存在事务则无事务运行
2.5 NOT_SUPPORTED, 以非事务的方式运行,存在事务则把当前事务挂起
表示以非事务的方式运行,如果当前存在事务,则把当前事务挂起。
2.6 MANDATORY,强制事务执行,不存在事务则抛出异常。
如果存在一个事务,则事务的运行,没有事务则抛出异常。
2.7 NEVER,以非事务来运行,存在事务则抛出异常。
总是非事务的运行,如果存在一个活动的事务,则抛出异常。
3.事务失效的场景
在方法上添加@Transactional 注解后,Spring 会基于这个类生成一个代理对象,会将这个代理对象作为 bean,当使用这个代理对象的方法时,那么代理逻辑会先把事务的自动提交设置为 false,然后再去执行具体的业务逻辑,如果执行逻辑没有出现异常,那么代理逻辑就会将事务进行提交,如果执行逻辑出现了异常,那么则会将事务进行回滚。默认情况下会对 RuntimeException 和 Error 进行回滚。可以利用 @Transactional 注解中的 rollbackFor 属性进行配置异常信息。
3.1 非public修饰的方法
@Transactional 只能用于 public 的方法上,否则事务不会生效,如果要用在非 public 方法上,可以开启 AspectJ 代理模式。
3.2 自身调用
事务的管理是通过代理执行的方式生效的,如果是方法内部调用,没有经过 Spring 的代理类,就调用不到了
3.3 被 final、static 关键字修饰的类或方法
3.4 没有被 Spring 管理
没有注入到IOC容器的的类。
3.5 数据库不支持事务
比如 Mysql 的 Myisam 存储引擎是不支持事务的,只有 innodb存储引擎才支持。
3.6 异常被捕获
当异常被捕获后,而且没有再抛出,那么事务是不会回滚的。
3.7 异常类型错误
@Service
public class OrderServiceImpl implements OrderService @Transactionalpublic void updateOrder(Order order) {try {// update order} catch {throw new Exception("更新错误");}}
}
这样事务也是不生效的,因为默认回滚的是:RuntimeException 和 Error,如果想触发其他异常的回滚,需要在注解上配置一下,如通过指定@Transactional(rollbackFor = Exception.class)的方式进行全异常捕获。
3.8 多线程调用
Spring 的事务是通过数据库连接来实现,而数据库连接是放在 ThreadLocal 里面。同一个事务,只能用同一个数据库连接。而多线程场景下,拿到的数据库连接是不一样的。
相关文章:

Spring事务的七种传播行为
Spring事务的七种传播行为 1.事务的传播行为是什么?2.具体传播行为2.1 REQUIRED ,默认,存在事务则加入该事务,不存在则新建一个事务2.2 REQUIRES_NEW,每次新开启事务,新老事务相互独立2.3 NESTED࿰…...

win10怎么卸载软件干净?电脑彻底删除软件的方法介绍,一键清理卸载残留!
电脑上经常会下载各种各样的软件来协助我们办公,不同的软件能够满足不同的需求。 但是不少软件可能使用频率没有那么高,甚至完全不使用。这个时候就需要将这些不常用的电脑软件卸载掉了,卸载软件能够释放一定的存储空间,提高电脑…...

excel中,将时间戳(ms或s)转换成yyyy-MM-dd hh:mm.ss或毫秒格式
问题 在一些输出为时间戳的文本中,按照某种格式显示更便于查看。 如下,第一列为时间戳(s),第二列是转换后的格式。 解决方案: 在公式输入框中输入:yyyy/mm/dd hh:mm:ss TEXT((A18*3600)/8640070*36519, "yyy…...

机房巡检机器人有哪些功能和作用
随着数据量的爆炸式增长和业务的不断拓展,数据中心面临诸多挑战。一方面,设备数量庞大且复杂,数据中心内服务器、存储设备、网络设备等遍布,这些设备需时刻保持良好运行状态,因为任何一个环节出现问题都可能带来严重后…...

Redis Search系列 - 第一讲 创建索引
目录 一、引言二、全文检索基本概念三、创建索引 一、引言 Redis Search 是 Redis 的一个模块,用于提供全文搜索和二级索引功能。它允许在 Redis 数据库中执行复杂的搜索查询,并支持多种数据类型和查询操作。以下是 Redis Search 的一些关键特性&#x…...

bat 重置 Navicat 试用
bat 脚本文件 echo off set dnInfo set dn2ShellFolder set rpHKEY_CURRENT_USER\Software\Classes\CLSID :: reg delete HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium\Registration14XCS /f %针对<strong><font color"#FF0000">navicat<…...

【真题笔记】09-12年系统架构设计师要点总结
【真题笔记】09-12年系统架构设计师要点总结 41 视图DSSA(特定领域架构)集成系统数据库管理设计模式操作符运算符综合布线备份数据库集成工作流技术软件质量保证需求管理需求开发结构化方法企业战略数据模型事务数据库主题数据库系统设计原型开发静态分析…...

Node + HTML搭建自己的ChatGPT [基础版]
文章目录 明明外面的ChatGPT产品那么多了,为什么要在本地搭建自己的ChatGPT呢?整体架构流程1. 获取APIKey1.1 常见的AI模型1.2 为什么选DeepSeek1.3 怎么获取DeepSeek的APIKey1.3.1 注册并登录DeepSeek开放平台1.3.2 选择API keys1.3.3 创建API key1.3.4…...

关于小程序审核需要提交订单列表页面path的修改办法
小程序又又又又又搞事情啦~~~ 从12月31号起,所有有订单生成逻辑的小程序在审核过程中,必须要填写订单列表页面的path才可以进行审核 在代码层面上会有一些小的改动,下面就告诉大家怎么去修改吧。 第一步…...
使用 Nginx 在同一端口部署两个前端项目并配置子路径
在现代 Web 开发中,我们经常需要在同一台服务器上部署多个前端项目。这不仅可以节省资源,还可以简化管理。本文将指导你如何使用Nginx在同一端口上部署两个前端项目,并通过配置子路径来区分它们。 环境准备 首先,我们需要准备两…...
怎么选择独立站SEO效果好的wordpress模板
选择独立站SEO效果好的WordPress模板需要考虑多个因素,包括模板的代码质量、加载速度、SEO友好性以及与SEO插件的兼容性。以下是一些具体的建议: 1. 代码简洁:选择代码简洁的WordPress主题,因为干净的代码不仅使网站更加安全可靠…...
深度学习速通系列:超长法律文件隐私过滤(基于预训练模型Bert)
法律文件隐私过滤 网上使用bert的中文模型进行命名识别教程少的可怜,摸索了一周的时间,硬是把法律文书的人名全部识别出来了,目前可以达到98.9999%(开玩笑的,不过准确率保守估计是有90%以上).注意:这个法律文书目前只是针对裁决书,其他还没测试过,可支持超长文本识别 github仓…...

【数据结构与算法】之队列详解
队列(Queue)是一种重要的线性数据结构,遵循先进先出、后进后出的原则。本文将更详细地介绍队列的概念、特点、Java 实现以及应用场景。 模运算小复习: a % b 的值总是小于b 5 % 4 1 5 % 2 1 1 % 5 1 4 % 5 4 1. 队列…...

python最新h5st4.9.1调用源码(2025-10-25)
废话不多说,直接上源码,需要技术支持的私。 一、调用js方法: # -*- coding: utf-8 -*- """ -------------------------------------------------Author: byc6352File: jdh5st.pyTime: 2024/10/25 08:03Technical Support:by…...

微软投资比特币:将总资产1%投资于BTC?股东投票决定最终结果!
随着比特币及其他加密货币在全球金融市场中的影响力不断增加,科技巨头微软(Microsoft)也开始考虑是否在其资产负债表上纳入比特币。根据近期提交给美国证券交易委员会(SEC)的文件,微软将在2024年12月10日举…...
vue中标签的ref和id的用法和区别优缺点
Vue 3 中 ref 和 id 的用法详解:区别、优缺点及使用场景 在 Vue 3 开发中,我们经常需要获取 DOM 元素或组件实例来进行交互。Vue 提供了 ref 和原生 HTML 属性 id 来实现这种操作。虽然 ref 和 id 都能标识并操作元素,但它们的使用方式、优缺…...
Python基础知识-文件篇
Python 的文件操作是指与文件进行交互的各种技术和方法,包括读取、写入、关闭文件等。以下是对 Python 文件操作的详细介绍: 打开文件 要进行文件操作,首先需要打开文件。Python 提供了内置的 open() 函数。 file open(example.txt, r) …...
MacOS 环境下 VSCode 的 C++ 环境搭建
MacOS 环境下 VSCode 的 C 环境搭建 编译器安装 编译器可以选择 Clang 或者 GCC,在 MacOS 上 Clang 的安装更为简单一些。 Clang(推荐) 打开终端输入命令, clang -v 查看是否已经安装。 如果已经安装,会输出类似于如下的信息࿱…...
WPF样式
WPF(Windows Presentation Foundation)是微软推出的一种用于构建Windows应用程序的UI框架。它提供了一套丰富的控件、图形和动画功能,允许开发者创建具有丰富视觉效果的现代用户界面。WPF中的样式(Styles)是一种强大的…...
Vue Router 如何配置 404 页面?
在 Vue 项目中,如果你想配置一个 404 页面(即找不到页面提示),你需要通过 Vue Router 来设置。这通常通过将路由配置中的 *(通配符)指向一个 404 组件来实现。 // 定义路由部分 const routes [{path: /,c…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...