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…...
PyVideoTrans终极指南:5分钟掌握视频翻译与配音的完整流程
PyVideoTrans终极指南:5分钟掌握视频翻译与配音的完整流程 【免费下载链接】pyvideotrans Translate the video from one language to another and embed dubbing & subtitles. 项目地址: https://gitcode.com/gh_mirrors/py/pyvideotrans PyVideoTrans是…...
SAP S/4HANA 利润中心(PCA)完整配置步骤
SAP S/4HANA 利润中心(PCA)完整配置步骤按项目上线标准顺序一步步来,从零到可用,含前台 后台、必配 可选,通俗易懂不绕弯路一、前期基础前提(必须先做好)公司代码、控制范围已创建控制范围与公…...
如何轻松构建多平台直播录制系统的完整指南
如何轻松构建多平台直播录制系统的完整指南 【免费下载链接】stream-rec Automatic streaming record tool. Live stream and bullet comments recorder. 虎牙/抖音/斗鱼/Twitch/PandaTV/微博直播,弹幕自动录制 项目地址: https://gitcode.com/gh_mirrors/st/stre…...
Sketch MeaXure深度揭秘:如何用开源插件实现设计标注效率提升300%?
Sketch MeaXure深度揭秘:如何用开源插件实现设计标注效率提升300%? 【免费下载链接】sketch-meaxure 项目地址: https://gitcode.com/gh_mirrors/sk/sketch-meaxure Sketch MeaXure是一款基于TypeScript重构的Sketch设计标注插件,专为…...
工业数据采集新思路:用一台NET30-CS桥接器同时搞定欧姆龙PLC的FINS/TCP和ModbusTCP协议
工业数据采集新思路:NET30-CS桥接器实现欧姆龙PLC双协议并行接入 在工业自动化系统升级过程中,新旧设备协议兼容性问题一直是困扰工程师的技术痛点。当车间里同时存在依赖FINS/TCP协议的老旧监控系统和仅支持ModbusTCP的新型MES平台时,传统解…...
【信息科学与工程学】【人工智能】【数字孪生】【游戏科学】主要数学模型-第八篇 计算血液学
计算血液学:理论与数学框架全体系 计算血液学是生物物理学、流体力学和反应动力学的交叉领域,研究血液作为多相智能流体的物理与数学原理。以下是从宏观血流到分子机制的全尺度数学模型体系。 一、血液流变学基础 模型类别 核心方程/定义 参数符号 物理意义 典型值范围 1. …...
PX4 Firmware V1.14.4 开源支持
PX4 官方固件版本迭代迅猛,这往往导致开发者在硬件兼容性、环境搭建及软件依赖性上遭遇重重挑战。为彻底解决这一问题,Kerloud 推出固件与文档长期支持(LTS)计划。我们将对飞控固件代码、技术文档及参数调优指南实施持续性维护&am…...
精读双模态检测论文二十六|DefDeN(兰州大学)创新点拉满!门控融合+可变形去噪+对比学习,LiDAR-Camera 3D检测暴力涨点!!!
🔥 本文定位:CSDN 原创干货 | 兰州大学/卧龙岗大学 LiDAR-Camera 3D目标检测 SOTA 方案 🎯 核心收益:一次性解决注意力融合三大痛点——收敛慢、计算量大、误检率高!基于门控多模态融合单元(GMFU࿰…...
Godot 4中构建真实水体渲染:从PBR原理到性能优化实践
1. 项目概述:从像素到波光,在Godot中构建真实水体如果你正在用Godot引擎开发一款开放世界游戏、一个宁静的模拟场景,或者任何需要水体表现的项目,那么“水”的质量几乎直接决定了场景的沉浸感上限。静态的、像果冻一样的平面贴图早…...
TrollInstallerX终极指南:3分钟搞定iOS 14-16.6.1 TrollStore安装
TrollInstallerX终极指南:3分钟搞定iOS 14-16.6.1 TrollStore安装 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX TrollInstallerX是当前iOS 14.0至16.6.1设…...
