当前位置: 首页 > news >正文

Spring 七种事务传播性介绍

作者:vivo 互联网服务器团队 - Zhou Shaobin

本文主要介绍了Spring事务传播性的相关知识。

Spring中定义了7种事务传播性:

  • PROPAGATION_REQUIRED 

  • PROPAGATION_SUPPORTS

  • PROPAGATION_MANDATORY

  • PROPAGATION_REQUIRES_NEW

  • PROPAGATION_NOT_SUPPORTED

  • PROPAGATION_NEVER

  • PROPAGATION_NESTED

在Spring环境中,含有事务的方法嵌套调用,事务是如何传递的规则,以及每种规则是如何开展工作的。文章还提到每种事务传播性是如何使用的,方便读者依据实际的场景,使用不同的事务规则。

一、什么是Spring事务的传播性

Spring 事务传播性是指, 在Spring的环境中,当多个含有事务的方法嵌套调用时,每个事务方法都处于自己事务的上下文中,其提交或者回滚行为应该如何处理。

通俗讲,就是当一个事务方法调用另外一个事务方法时,事务如何跨上下文传播。

图片

1)当事务方法A调用事务方法B时,事务方法B是合并到事务方法A中,还是开启新事务?

2)当事务方法B抛出异常时  ,在合并事务或者开启新的事务的场景中,事务的回滚是如何处理的 ?

以上事务的处理规则,都取决于事务传播级别的设置。

二、事务的传播性都有哪些行为

图片

事务的传播行为,主要分为三种类型,分别是:支持当前事务不支持当前事务嵌套事务

2.1 支持当前事务

REQUIRED:默认的事务传播级别,表示如果当前方法已在事务内,该方法就在当前事务中执行,否则,开启一个新的事务并在其上下文中执行。

SUPPORTED:当前方法在事务内,则在其上下文中执行该方法,否则,开启一个新的事务。

MANDATORY:必须在事务中执行,否则,将抛出异常。

2.2 不支持当前事务

REQUIRES_NEW:无论当前是否有事务上下文,都会开启一个事务  。如果已经有一个事务在执行 ,则正在执行的事务将被挂起 ,新开启的事务会被执行。

事务之间相互独立,互不干扰。

NOT_SUPPORTED:不支持事务,如果当前存在事务上下文,则挂起当前事务,然后以非事务的方式执行。

NEVER:不能在事务中执行,如果当前存在事务上下文,则抛出异常。

2.3 嵌套事务

NESTED:嵌套事务,如果当前已存在一个事务的上下文中,则在嵌套事务中执行,如果抛异常,则回滚嵌套事务,而不影响其他事务的操作。

三、每种事务的传播性如何工作

3.1 REQUIRED  

默认的事务传播行为,保证多个嵌套的事务方法在同一个事务内执行,并且同时提交,或者出现异常时,同时回滚。

这个机制可以满足大多数业务场景。

图片

例子 :

图片

图片

1)类TestAService的方法通过声明式事务的方式,加上了事务注解@Transactional ,并设置事务的传播性为REQUIRED。

2)调用者调用TestAService的A方法时,如果调用者没有开启事务,那么A方法会开启一个事务。

A方法的具体执行过程如下 :

a. 执行insert,但没有提交;

b. 调用TestBServcie的B方法,由于B方法也声明了事务,并且传播性是REQUIRED,所以方法B的事务,合并到方法A开启的事务中。

c. 方法B执行insert操作,此时也没有提交。

3)由于这两个方法的操作都在同一个事务中执行,当这两个方法所有操作执行成功之后,提交事务。

嵌套调用链路:

图片

当方法B 执行时抛出了 Exception 异常后,事务是如何处理的 ?

1)方法B声明了事务,insert操作会回滚

2)由于方法A和方法B 同属一个事务,方法A也会执行回滚,由此说明该规则保证了事务的原子性。

嵌套调用,异常后的链路:

图片

如果 方法B 抛出异常后,方法A 使用 try-catch 处理了方法B的异常(如下代码),并没有向外抛出,此时事务又如何处理的 ?

图片

方法A也会回滚。

从事务的特性我们可知,事务具有原子性。方法A和方法B同属一个事务,当方法B抛出异常,触发回滚操作后,整个事务的操作都会回滚。

因此,Spring 在处理事务过程中,当事务的传播性设置为REQUIRED,在整个事务的调用链上,任何一个环节抛出的异常都会导致全局回滚。

3.2 REQUIRES_ NEW

每次都开启一 个新的事务。

图片

例子:

图片

上面例子中,方法B的传播性设置为 REQUIRES_NEW,方法A仍然是REQUIRED,当A调用B时,具体调用链路如下:

图片

具体执行过程:

  • 方法A被执行前,如果调用者没有开启事务,方法A开启一个事务1,然后执行insert ,此时没有提交;

  • 方法B的事务传播性设置为REQUIRES_NEW,当被方法A调用时,此时方法A的事务1会被挂起,方法B开启自己的事务2,然后执行insert,此时并没有提交;

  • 当方法B执行完毕后,提交事务2;

  • 恢复事务1,最终提交。

当 方法B 执行时抛出了异常,会发生什么?

方法B的insert操作会被回滚掉,方法A不受影响。但这里有个前提,方法A需要try-catch方法B的异常,使其异常不会往上传递,从而导致方法A接收到异常,导致回滚。

图片

3.3  SUPPORTED

当外层方法A存在事务,方法B加入到当前事务中,以事务的方式执行。

图片

当外层方法A不存在事务,方法B不会创建新的事务,以非事务的方式执行。

图片

例子1:

图片

图片

以上例子,方法A没有加事务注解,方法B的加了事务注解,并且传播为SUPPORTS。

具体执行过程:

  • 方法A以非事务的方式执行insert操作。

  • 方法B被调用,由于其外层事务A没有开启事务,方法B也是以非事务方法执行insert操作。

图片

例子2:

图片

以上例子,方法A和B都加上了事务注解,其中方法A的传播性为REQUIRED,方法B的传播性为SUPPORTS。

具体执行过程:

  • 如果方法A的调用方没有开启事务,则方法A开启事务,并执行insert操作,但没有提交;

  • 方法B被调用,由于其外层方法A开启了事务,因此方法B加入到方法A开启的事务中,并执行insert,但没有提交;

  • 当事务中的所有操作执行成功后,事务提交。

图片

3.4  NOT_SUPPORTED

不支持事务。

如果外层方法存在事务,则挂起外层事务,以非事务方式执行,执行完毕后,恢复外层事务。

图片

例子:

图片

以上例子:方法A和B都加上了事务注解,方法A的传播性为REQUIRED,方法B为NOT_SUPPORTED。

具体执行过程:

  • 如A的调用方没有开启事务,方法A开启事务,并执行insert,但没有提交。

  • 方法A调用方法B时,方法B的传播性为NOT_SUPPORTED,不支持事务,然后挂起外层方法A的事务,方法B以非事务的方式执行insert。

  • 方法B执行完毕后,恢复方法A的事务,最终提交事务。

调用链路过程:

图片

3.5 NEVER

不支持事务

当外层方法A开启了事务,方法B抛出异常

图片

例子:

图片

以上代码,两个方法都打上了事务注解,方法A的传播性是REQUIRED,方法B的传播性是NEVER。

具体执行过程:

  • 方法A开启事务,执行insert,没有提交。

  • 含有事务的方法A调用方法B,方法B的传播性是NEVER,表示不支持事务,因此方法B抛出异常。

  • 方法A的事务执行回滚。

图片

3.6 MANDATORY

必须在事务中执行。

如果外层方法A没有开启事务,方法B抛出异常。

图片

如果外层方法A开启了事务,方法B加入事务,方法A&B在同一事务中执行。

图片

例子:

图片

以上例子,方法A没有加事务注解,方法B 的传播性为 MANDATORY。

具体执行过程:

  • 方法A的调用方如果本身没有开启事务,方法A执行前不会开启事务。

  • 当非事务方法A调用方法B时,由于方法B的传播性为MANDATORY,必须在事务中执行,条件不满足,抛出异常。

图片

3.7 NESTED

嵌套事务

  • 如果外层方法A不存在事务,内层方法B的规则与REQUIRED 一致。

  • 如果外层方法A存在事务,内层方法B做为外层方法A事务的子事务执行,两个方法是一起提交,但子事务是独立回滚。

    内层方法B抛出异常,则会回滚方法B的所有操作,但不影响外层事务方法A。(方法A需要try-catch子事务,避免异常传递到父层事务)

    外层方法A回滚,则内层方法B也会回滚。

  • 该传播性的特点是可以保存状态点,当回滚时,只会回滚到某一个状态点,保证了子事务之间的独立性,避免嵌套事务的全局回滚。

图片

例子:

图片

以上例子,方法A的传播性为REQUIRED,方法B为NESTED。

具体执行过程:

  • 方法A执行时,如调用方没有开启事务,则开启一个事务。

  • 方法B被外层方法A调用时,因为方法B的传播性为NESTED,方法B在此处建立savepoint,标记insert行为。

  • 当方法B抛出异常,其insert操作会回滚,但只会回滚到savepoint,(前提是方法A要try-catch方法B,使方法B的异常不会往外传递)。

  • 方法B回滚后,方法A的事务提交。

调用链路:

图片

四、总结

本文解释了Spring框架中的事务传播性,即多个业务方法之间调用时事务如何处理的规则。Spring提供了七种传播级别,如PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW等。

每种级别都有适用场景和限制,本文提供了一些示例,介绍了声明式事务如何使用,每种事务的规则,产生哪种行为,当方法抛出异常时,事务的提交和回滚是如何被处理的。正确处理事务对于任何企业级应用程序都是必要的,了解Spring事务传播性是构建高效、可靠和可扩展应用程序的关键。

相关文章:

Spring 七种事务传播性介绍

作者:vivo 互联网服务器团队 - Zhou Shaobin 本文主要介绍了Spring事务传播性的相关知识。 Spring中定义了7种事务传播性: PROPAGATION_REQUIRED PROPAGATION_SUPPORTS PROPAGATION_MANDATORY PROPAGATION_REQUIRES_NEW PROPAGATION_NOT_SUPPORTED…...

Count the Colors ZOJ - 1610

题目链接 题意: 给定n个区间[ l, r ]和颜色c, 每次给[l, r]涂上c这个颜色. 后面的涂色会覆盖之前的涂色. 最后要求输出区间[0, 8000]中每种颜色及其出现的次数, 如果该颜色没有出现过则不输出. 思路:典型的线段树区间染色问题,一般这种题…...

MATLAB点云处理总目录

一、点云滤波 原始点云包含过多噪点和冗余点,滤波和采样往往是点云预处理的必要步骤 1.滤波 重复点去除 NAN或INF无效点去除 自定义半径滤波 2.采样 基于空间格网的点云抽稀 随机下采样 均匀体素下采样 非均匀体素下采样 二、邻近搜索 如何组织点云快速获取当前…...

C语言逗号表达式如何计算

在 C 语言中,逗号表达式是一种特殊的表达式形式,它由逗号分隔的多个表达式组成。 逗号表达式的计算过程如下:1、从左到右依次计算每个表达式的值。2、最终返回的值是最右边表达式的值。3、逗号表达式的求值过程是顺序执行的,不会…...

Ubuntu 本地部署 ChatGPT-Next-Web

Ubuntu 本地部署 ChatGPT-Next-Web 文章目录 Ubuntu 本地部署 ChatGPT-Next-Web ChatGPT-Next-Web 项目地址:https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web 本文主要演示如何在 Ubuntu 本地(默认是端口 3000)部署 ChatGPT-Next-Web&am…...

小程序商城搭建:快速入门指南

随着移动互联网的普及,小程序商城逐渐成为了商家们进行线上销售的重要渠道。如果你也想搭建一个小程序商城,那么本文将为你介绍如何使用乔拓云这一第三方小程序搭建平台来轻松搭建自己的小程序商城。 一、选择合适的第三方小程序搭建平台 在选择第三方小…...

c# windows10大小端试

测试代码: unsafe public void ceshi() {byte[] by BitConverter.GetBytes(0x12345678);Debug.WriteLine(" byte[0] 0x" by[0].ToString("x2"));Debug.WriteLine(" byte[1] 0x" by[1].ToString("x2"));Debug.WriteLi…...

【算法专题】动态规划之斐波那契数列模型

动态规划1.0 动态规划 - - - 斐波那契数列模型1. 第 N 个泰波那契数2. 三步问题3. 使用最小花费爬楼梯4. 解码方法 动态规划 - - - 斐波那契数列模型 1. 第 N 个泰波那契数 题目链接 -> Leetcode -1137. 第 N 个泰波那契数 Leetcode -1137. 第 N 个泰波那契数 题目&…...

K2P路由器刷OpenWrt官方最新版本固件OpenWrt 23.05.2方法 其他型号的智能路由器OpenWrt固件刷入方法也基本上适用

最近路由器在开机时总出问题,于是就那他来开刀,直接刷一个OpenWrt官方最新版本的固件, 刷其他第三方的固件总是觉得不安全, 而且很多第三方固件都带了些小工具,始终会有安全隐患, 而且占用内存空间太多,本来这个东西就没有多少内存,于是就干脆刷一个官方的原始固件(才6.3M, 相…...

AI大语言模型会带来了新一波人工智能浪潮?

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…...

How to view the high-tech zone atmospheric project

How to view the high-tech zone atmospheric project 问题与建议登录界面没有验证码部分页面加载时间过长联动型下拉列表框点击反应迟钝页面缺乏导航没有采用https协议没有完成域名实名认证左侧菜单区不能收缩大屏区域功能图层不能完全隐藏部分页面表单控件没有文案提示其功能…...

sqlalchemy 中的缓存机制解释

SQLAlchemy 的缓存机制主要涉及两个层面:会话(Session)缓存和查询缓存。这两种缓存机制对于提升应用性能和数据一致性都非常重要。下面详细解释这两种缓存机制: 1. 会话(Session)缓存 会话缓存是 SQLAlch…...

网络安全B模块(笔记详解)- 漏洞扫描与利用

漏洞扫描与利用 1.通过Kali对服务器场景server2003以半开放式不进行ping的扫描方式并配合a,要求扫描信息输出格式为xml文件格式,从生成扫描结果获取局域网(例如172.16.101.0/24)中存活靶机,以xml格式向指定文件输出信息(使用工具Nmap,使用必须要使用的参数),并将该操…...

【C语言】指针——从底层原理到应用

C语言指针-从底层原理到花式技巧,用图文和代码帮你讲解透彻 目录 一、前言二、变量与指针的本质 1. 内存地址2. 32位与64位系统3. 变量4. 指针变量5. 操作指针变量 5.1 指针变量自身的值5.2 获取指针变量所指向的数据5.3 以什么样的数据类型来使用/解释指针变量所指…...

想了解步进伺服的朋友可以了解下这个方案

TMC4361A 是一款小型化、高性能的驱动步进电机的运动控制器。实用于很多的斜坡轮廓的应用,特别是速度快、限制过冲的运动场合。用户根据自己的要求实现 S 形或 sixPoint™六点式速度轮廓配置及闭环或开环的操作、动态修改运动参数。TMC4361A 包含 SPI接口、Step/Dir…...

航天航空线束工艺3D虚拟展馆支持多人异地参观漫游

为了满足汽车线束企业员工工作需要,让新老员工了解到更先进、规范的线束工艺设计技术,华锐视点基于VR虚拟仿真、web3d开发和图形图像技术制作了一款汽车线束工艺设计VR虚拟仿真模拟展示系统。 汽车线束工艺设计VR虚拟仿真模拟展示系统共分为pc电脑端和VR…...

JAVA面向对象基础-容器

一、泛型 我们可以在类的声明处增加泛型列表&#xff0c;如&#xff1a;<T,E,V>。 此处&#xff0c;字符可以是任何标识符&#xff0c;一般采用这3个字母。 【示例9-1】泛型类的声明 1 2 3 4 5 6 7 8 9 10 class MyCollection<E> {// E:表示泛型; Object[] o…...

2022年山东省职业院校技能大赛高职组信息安全管理与评估—开发测试服务器解析

任务5:开发测试服务器 目录 任务5:开发测试服务器 解题方法:...

2024年我国网络安全发展形势展望

2023年&#xff0c;我国网络安全政策法规陆续出台&#xff0c;网络安全与数据安全产业发展势头强劲&#xff0c;网络安全形势整体向好。展望2024年&#xff0c;世界各国在网络空间中的竞争将变得愈发激烈&#xff0c;我国网络安全领域的法律法规将不断完善&#xff0c;数据安全…...

如何使用 NFTScan NFT API 在 PlatON 网络上开发 Web3 应用

PlatON 是由万向区块链和矩阵元主导开发的面向下一代的全球计算架构&#xff0c;创新性的采用元计算框架 Monad 和基于 Reload 覆盖网络的同构多链架构&#xff0c;其愿景是成为全球首个提供完备隐私保护能力的运营服务网络。它提供计算、存储、通讯服务&#xff0c;并提供算力…...

如何使用web文件管理器Net2FTP搭建个人网盘

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…...

总结多线程的各种锁

1、公平锁和非公平锁 公平锁是严格按照线程请求的顺序来分配锁&#xff0c;每一个线程都能获取到锁&#xff0c;避免线程饥饿现象&#xff1b;相反&#xff0c;非公平锁表示线程竞争锁时可以插队来抢占资源。 非公平锁在大多数情况下效率优于公平锁&#xff0c;因为公平锁涉及到…...

树形结构的窗口小部件

这段代码是一个使用Qt框架的C程序&#xff0c;实现了一个树形结构的窗口小部件&#xff08;TreeWidget&#xff09;。以下是主要的解释&#xff1a; #include "treewidget.h" #include "ui_treewidget.h"TreeWidget::TreeWidget(QWidget *parent) : QWidg…...

【现代密码学】笔记3.1-3.3 --规约证明、伪随机性《introduction to modern cryphtography》

【现代密码学】笔记3.1-3.3 --规约证明、伪随机性《introduction to modern cryphtography》 写在最前面私钥加密与伪随机性 第一部分密码学的计算方法论计算安全加密的定义&#xff1a;对称加密算法 伪随机性伪随机生成器&#xff08;PRG&#xff09; 规约法规约证明 构造安全…...

Redis底层原理

持久化 Redis虽然是个内存数据库,但是Redis支持RDB和AOF两种持久化机制,将数据写往磁盘,可以有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。 RDB RDB持久化是把当前进程数据生成快照保存到硬盘的过程。所谓内存快照,就是…...

掌握亚马逊、Lazada、shopee、速卖通、eBay、wish测评自养号补单系统:解锁跨境电商新机遇

在选择测评环境系统时&#xff0c;市面上有很多选项。但是&#xff0c;究竟哪个系统使用起来更高效、成本更低、成功率更高呢&#xff1f;下面将详细分析各种网络环境的使用经验&#xff0c;希望能帮助大家避免一些不必要的困扰和错误。我曾经亲自尝试过各种网络环境&#xff0…...

15_多线程

文章目录 OS中的基本概念进程&#xff08;process&#xff09;与线程&#xff08;thread&#xff09;串行(serial)、并行(parallel)与并发(concurrency)同步(synchronization)与异步(asynchronization) java程序运行原理java命令主类类名运行原理 多线程的实现方式一&#xff1…...

吉他打谱软件Guitar Pro8苹果Mac电脑简体中文特别版

Guitar Pro 8 Mac是一款吉他编曲学习软件&#xff0c;用于吉他、贝和其他弦乐器的制谱和演奏&#xff0c;这是一个多轨编辑器&#xff0c;具有集成的 MIDI 编辑器、合唱绘图仪、吉他、节拍器和其他音乐家工具。它使您能够编辑吉他、贝司和尤克里里、乐谱、指法谱&#xff0c;并…...

go study oneday

这段代码的详细解释&#xff0c;涵盖了Go 语言变量声明、函数调用、用户输入、类型转换以及结果输出。 package main import "fmt" func main() {var num1 intvar num2 float32var num3 intfmt.Println("请输入数字一&#xff1a;")fmt.Scanln(&num1)f…...

Avatar虚拟数字人方案,元宇宙时代的企业新动力

随着元宇宙概念的兴起&#xff0c;虚拟数字人技术逐渐成为各行业关注的焦点。为了满足市场需求&#xff0c;美摄科技凭借专业、自研的虚拟数字人技术&#xff0c;结合强大的ChatGPT能力&#xff0c;隆重推出Avatar虚拟数字人方案&#xff0c;助力企业实现营销及内容创作的生产力…...

记事本做网站格式/seo网站排名优化案例

set nocompatible " 关闭 vi 兼容模式 syntax on " 自动语法高亮colorscheme molokai " 设定配色方案set number " 显示行号set cursorline " 突出显示当前行set ruler &…...

南京高新区规划建设局网站/优就业seo

发现当表中有很多上万条数据时&#xff0c;越后的数据用limit分页显示就越慢&#xff08;>2秒&#xff09;&#xff0c;可能是mysql的特性所致。所以花了点时间总结实现了更优解决方案&#xff0c;最终实现毫秒级响应。若网友有更优的&#xff0c;请留言&#xff0c;谢谢&am…...

做网站还有用/软文代写网

即abc输出abc,acb,bac,bca,cab,cba 思路:先以非递归方式,完成部分 public static void Rotate(char[] str) {var length str.Length;int i 1;for (int j 0; j < length; j){foreach (var item in str){Console.Write(item);}Console.WriteLine();char temp str[0];//mov…...

知道一个网站怎么知道是谁做的百度优化/移动网站优化排名

接上一篇随笔。这里没有用到MyBatis最关键的映射器接口&#xff0c;因此只做个简单的insert操作&#xff0c;update和delete同理&#xff0c;就不再赘述了。 直接上代码&#xff1a; 首先是dao包下的UserDAO.java文件&#xff1a; package com.alleymeowy.dao;import com.alley…...

深圳做网站 百度智能小程序/宁波优化网站哪家好

2019独角兽企业重金招聘Python工程师标准>>> 虹软人脸识别SDK之Java版&#xff0c;支持SDK 1.1&#xff0c;以及当前最新版本2.0&#xff0c;滴滴&#xff0c;抓紧上车&#xff01; JDK SDK Win release license status 前言 由于业务需求&#xff0c;最近跟人脸识别…...

超简单做网站软件/搜索引擎优化师工资

前言&#xff1a; uni-app中方法整理之请求后台接口。个人封装版本与官方提供方法。 官方入口&#xff1a; 封装版本&#xff1a;目录见下 1、新建文件夹api&#xff0c;这里主要放接口信息 login.js 放登录页面的接口方法 import axios from ../util/http const Login {/…...