Spring中事务的传播机制

news2024/11/19 11:26:29

一、前言

首先事务传播机制解决了什么问题

Spring 事务传播机制是包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。

事务的传播级别有 7 个,支持当前事务的:REQUIRED、SUPPORTS、MANDATORY;

不支持当前事务的:REQUIRES_NEW、NOT_SUPPORTED、NEVER,以及嵌套事务 NESTED,其中 REQUIRED 是默认的事务传播级别。

举个栗子,方法A是一个事务的方法,方法A执行过程中调用了方法B,那么方法B有无事务以及方法B对事务的要求不同都会对方法A的事务具体执行造成影响,同时方法A的事务对方法B的事务执行也有影响,这种影响具体是什么就由两个方法所定义的事务传播类型所决定。

二、在spring中有七种事务传播行为

Spring 事务传播机制可使用 @Transactional(propagation=Propagation.REQUIRED) 来定义,Spring 事务传播机制的级别包含以下 7 种:

  1. Propagation.REQUIRED:默认的事务传播级别,它表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  2. Propagation.REQUIRES_NEW:表示创建一个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部方法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。
  3. Propagation.NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED。
  4. Propagation.SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  5. Propagation.MANDATORY:(mandatory:强制性)如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  6. Propagation.NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  7. Propagation.NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

REQUIRED:只要出错了都会回滚,无论外层内层

保证同一个事务中

PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认):REQUIRED:只要出错了都会回滚,无论外层内层

PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务

PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常

保证没有在同一个事务中

PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务:外层try-catch。 结果:外层提交,内层回滚

PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务

PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常

PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行

三、Spring 事务隔离级别

Sping 中的事务隔离级别有 5 种,它们分别是:

  1. DEFAULT:Spring 中默认的事务隔离级别,以连接的数据库的事务隔离级别为准;
  2. READ_UNCOMMITTED:读未提交,也叫未提交读,该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读;
  3. READ_COMMITTED:读已提交,也叫提交读,该隔离级别的事务能读取到已经提交事务的数据,因此它不会有脏读问题。但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读;
  4. REPEATABLE_READ:可重复读,它能确保同一事务多次查询的结果一致。但也会有新的问题,比如此级别的事务正在执行时,另一个事务成功的插入了某条数据,但因为它每次查询的结果都是一样的,所以会导致查询不到这条数据,自己重复插入时又失败(因为唯一约束的原因)。明明在事务中查询不到这条信息,但自己就是插入不进去,这就叫幻读 (Phantom Read);
  5. SERIALIZABLE:串行化,最高的事务隔离级别,它会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多。

所以,相比于 MySQL 的事务隔离级别,Spring 中多了一种 DEFAULT 的事务隔离级别。 事务隔离级别与问题的对应关系如下:

参考文献

https://zhuanlan.zhihu.com/p/148504094

spring,springboot之事务(事务传播机制详解、嵌套事务)_事务嵌套事务的生效情况和事务传播的关系-CSDN博客

https://www.cnblogs.com/vipstone/p/16735893.html

https://www.cnblogs.com/vipstone/p/16735893.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1856682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为某员工爆料:偷偷跑出去面试,被面试官鄙视了。第一句话就问:华为淘汰的吧,35岁了,这个年龄在华为能混得下去吗?身体没啥毛病吧

“你都35岁了,难不成是被华为淘汰的?在华为混不下去了吧?身体没啥毛病吧,我们这体检可是很严的。” 近日,一位华为员工在朋友圈爆料,自己在面试时遭到了面试官的无理取闹和人身攻击,原因仅仅是因…

中东文明史

转自:想要了解完整的中东文明史?这篇文章成全你 - 知乎 (zhihu.com) 写在前面 中东文明是人类历史上最古老的文明。人类祖先从东非大裂谷走出之后,首先选择定居在中东地区的新月沃土上,并建立了人类历史上有文字记载的第一个文明…

利用Frp实现内网穿透(docker实现)

文章目录 1、WSL子系统配置2、腾讯云服务器安装frps2.1、创建配置文件2.2 、创建frps容器 3、WSL2子系统Centos服务器安装frpc服务3.1、安装docker3.2、创建配置文件3.3 、创建frpc容器 4、WSL2子系统Centos服务器安装nginx服务 环境配置:一台公网服务器&#xff08…

【zabbix】zabbix客户端配置

1、部署zabbix客户端 #zabbix 5.0 版本采用 golang 语言开发的新版本客户端 agent2 。 #zabbix 服务端 zabbix_server 默认使用 10051 端口,客户端 zabbix_agent2 默认使用 10050 端口。 systemctl disable --now firewalld setenforce 0 hostnamectl set-hostname…

C语言 | Leetcode C语言题解之第171题Excel表列序号

题目: 题解: int titleToNumber(char* columnTitle) {int number 0;long multiple 1;for (int i strlen(columnTitle) - 1; i > 0; i--) {int k columnTitle[i] - A 1;number k * multiple;multiple * 26;}return number; }

【Linux 基础】文件与目录管理

1. 文件和目录的基本概念 文件:是数据的集合,可以是文本、图像、视频等。 目录(也称为文件夹):是文件和子目录的集合,用于组织文件。 2. 目录和路径 绝对路径:从根目录(/&#x…

已经被驳回的商标名称还可以申请不!

看到有网友在问,已经驳回的商标名称还可以申请不,普推商标知产老杨觉得要分析看情况,可以适当分析下看可不可以能申请,当然最终还是为了下证 ,下证概率低的不建议申请。 先看驳回理由,如果商标驳回是绝对理…

Spring Boot 学习第七天:动态代理机制与Spring AOP

1 概述 在Java的世界中,实现AOP的主流方式是采用动态代理机制,这点对于Spring AOP也一样。代理机制的主要目的就是为其他对象提供一种dialing以控制对当前对象的访问,用于消除或缓解直接访问对象带来的问题。通过这种手段,一个对象…

Java | Leetcode Java题解之第169题多数元素

题目: 题解: class Solution {public int majorityElement(int[] nums) {int count 0;Integer candidate null;for (int num : nums) {if (count 0) {candidate num;}count (num candidate) ? 1 : -1;}return candidate;} }

(2011-2022年) 全国各省快递业务量与快递业务收入面板数据

中国快递业近年来随着电子商务的蓬勃发展而迅速壮大,成为现代生活中不可或缺的一部分。快递业务量与收入的面板数据为我们提供了一个观察中国快递市场繁荣与多元化的窗口。 数据来源 中国统计年鉴 参考文献 胡润哲, 魏君英, 陈银娥. 数字经济发展对农村居民服务…

如何把文件扫描成电子版pdf?这4个方法包教包会~

大多数时候,我们为了更加方便存档与文件共享,都会借助专用的扫描仪来把文件扫描成PDF文档~但其实现在想要扫描文件并不是只有扫描仪能够搞定,还有很多的方法和工具都能够代替它来一一实现。 就好比下面罗列出来的四大文件扫描方法&#xff0…

【STM32学习】基于I2C协议的OLED显示(利用U8G2库)

目录 一、I2C协议、时序协议 1.1 I2C协议: 1.2时序协议: 二、OLED原理 2.1主流显示面板技术 2.2OLED发光原理: 2.3汉字点阵显示原理 三、U8G2 四、代码移植 4.1创建工程(HAL库): 4.1.1CubexMX配置…

Gemalto加密狗的优势

Gemalto加密狗,作为硬件加密技术的杰出代表,为软件开发商和用户提供了一种高效、安全的解决方案。这种加密狗不仅拥有卓越的加密性能,还具备易用性和可靠性,是保护软件知识产权和防止非法复制的重要工具。 一、Gemalto加密狗的核心…

华为仓颉语言:编程语言的新篇章

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【数据结构】【版本1.4】【线性时代】——队列

快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、队列的概念二、队列的模拟实现2.1 定义2.2 初始化2.3 销毁2.4 入队2.5 判空2.6 出队2.7 获取队头元素…

ImportError: No module named createrepo

我在用createrepo命令创建本地源时,出现如下: ImportError: No module named createrepo原因估计就是之前升级python2.6为2.7时导致(系统为centos7),看网上很多说, 修改/usr/share/createrepo/genpkgmeta…

7.系统工具——黑马程序员Java最新AI+若依框架项目

目录 前言一、表单构建任务:设计添加课程表单 二、 代码生成1.任务:将部门表在页面端显示改为树形结构 三、系统接口任务:使用sagger进行接口测试 前言 提示:本篇讲解若依框架 系统工具 一、表单构建 功能:完成前端…

ASP.Net.WebAPI和工具PostMan

1.WebAPI概述 1.1 WebAPI WebAPI 是一种传统的方式,用于构建和暴露 RESTUI风格的Web服务。它提供了丰富的功能和灵活性,可以处理各种HTTP请求,并支持各种数据格式,如JSON、XML等。 WebAPI使用控制器(Controllers)和动作方法(Ac…

关于最强模型Claude 3.5 Sonnet,你需要知道的10条总结!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之…

VMware Workstation克隆虚拟机详细步骤

克隆虚拟机 首先我们先创建一台虚拟机,将该虚拟机关闭后,然后右键该虚拟机按照图下所示点击 克隆 下一页 下一页 这里按照需求选择克隆类型,我选择创建完整克隆。点击下一步 设置好虚拟机名称和位置,点击完成 稍微等待一会 点击 …