Spring中事务的传播机制

一、前言

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

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.mzph.cn/bicheng/34702.shtml

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

相关文章

[Django学习]前端+后端两种方式处理图片流数据

方式1:数据库存放图片地址,图片存放在Django项目文件中 1.首先,我们现在models.py文件中定义模型来存放该图片数据,前端传来的数据都会存放在Django项目文件里的images文件夹下 from django.db import modelsclass Image(models.Model):title models.C…

幻兽帕鲁更新时间 幻兽帕鲁最新更新内容一览

超级缝合怪游戏幻兽帕鲁相信大家都有所了解了,游戏刚出的时候也是引起很大的轰动,吸引了很多玩家,一度登上steam榜首,游戏借鉴了“全球最赚钱IP”任天堂宝可梦的收集神奇生物系统,缝合到更多开放世界游戏玩法里&#x…

【背包题解】DP代表了走到阶段i 的所有路线的最优解

1889:【提高】多重背包(2) 二维费用背包 2075 - 最大卡路里 1928 - 采购礼品 感谢 背包容量:(c) 6 重量 weight 2 2 4 6 2 1 2 3 4 5 价值 value 3 6 5 5 8 1 2 3 4 5 wvdp数组:记录有i件…

使用 GitOps 进行防灾 MinIO

想象一下,您已经花费了无数小时来完善 Docker Swarm 设置,精心设计每项服务,并调整 CI/CD 管道以实现无缝自动化。现在,想象一下这个经过微调的系统被重置为原点,不是因为严重的故障或安全漏洞,而是因为数据…

前端框架海洋:如何破浪前行,寻找你的“黄金舟”

在当今前端开发的世界里,框架和样式库如同繁星,琳琅满目,令人目不暇接。Vue、React、Angular三大巨头稳坐江山,而新兴的Svelte、Solid等后起之秀也不甘示弱,加之各类UI库如Bootstrap、Tailwind CSS、Ant Design等&…

Python开发日记--手撸加解密小工具(2)

目录 1. UI设计和代码生成 2.运行代码查看效果 3.小结 1. UI设计和代码生成 昨天讨论到每一类算法设计为一个Tab,利用的是TabWidget,那么接下来就要在每个Tab里设计算法必要的参数了,这里我们会用到组件有Label、PushButton、TextEdit、Ra…

【算法】数组-基础知识与应用

一.基础理论 数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便的通过下标索引的方式获取到下标对应的数据。 数组下标都是从0开始的。数组内存空间的地址是连续的 因为数组在内存空间的地址是连续的,所以我们在删除或者增添元素的时候&#xff0c…

【华为HCIA数通网络工程师真题-构建以太网交换网络】

华为HCIA数通网络工程师真题-构建以太网交换网络 一、1-10题 一、1-10题 1、如图所示,四台交换机都运行 STP,各种参数都采用默认值如果交换机C的G0/0/2端口发生阻塞并无法通过该端口发送配置 BPDU,则网络中 blocked 端口多久之后会进入到转发…

【数据结构与算法】动态查找表(二叉排序树,二叉平衡树)详解

二叉排序树的数据结构。 struct TreeNode {ElemType data;TreeNode *left, *right; }; using BiTree TreeNode *;结构体包含三个成员: data 是一个 ElemType 类型的变量,用于存储二叉搜索树节点的数据。left 是一个指向 TreeNode 类型的指针&#xff…

动态规划数字三角形模型——AcWing 1015. 摘花生

动态规划数字三角形模型 定义 动态规划数字三角形模型是在一个三角形的数阵中,通过一定规则找到从顶部到底部的最优路径或最优值。 运用情况 通常用于解决具有递推关系、需要在不同路径中做出选择以达到最优结果的问题。比如计算最短路径、最大和等 注意事项 …

java —— 网络编程(TCP)

网络编程三要素:IP,端口号,协议。 一、连接 客户端使用 Socket 类: Socket snew Socket(目标主机IP,端口号); 服务器端使用 ServerSocket 类: ServerSocket ssnew ServerSocket(端口号); Socket sss.…

【SAP HANA 35】HANA窗口函数PARTITION BY示例

窗口函数允许对数据进行高级分析和计算,例如排名和累计和。 -- 计算每个员工在其职位组中的工资排名 SELECTFirstName,LastName,Position,Salary,RANK() OVER (PARTITION BY FirstName,LastName ORDER BY Salary DESC) AS Rank FROM Employees;-- 计算每个员工在其…

TXL编程语言环境安装

TXL(Tree Transformation Language)是一种专门用于源代码分析和转换的编程语言。它基于树形结构,可以帮助开发人员进行各种代码重构、代码生成、语法转换等操作。TXL具有强大的模式匹配和模式替换功能,因此在软件工程和编程语言研…

new和delete操作符的作用以及与malloc和free进行比较

new 和 delete 是在C中用于动态内存分配和释放的操作符,而 malloc 和 free 则是在C语言(以及C中作为C的兼容部分)中用于相同目的的函数。以下是它们各自的作用以及它们之间的比较: new 和 delete 作用: new&#xf…

速盾:DDOS能打死高防ip吗?

DDoS攻击是一种利用大量计算机或设备发起的分布式拒绝服务攻击。它的目标是通过发送大量流量或请求,使目标服务器或网络资源无法正常工作。高防IP是一种具有强大防御能力的网络服务,能够抵御各种形式的网络攻击,包括DDoS攻击。然而&#xff0…

英文输入法(75%用例)C卷(JavaPythonC++Node.jsC语言)

主管期望你来实现英文输入法单词联想功能。需求如下: 依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词,按字典序输出联想到的单词序列,如果联想不到,请输出用户输入的单词前缀。 注意: 1. 英文单词联想时,区分大小写 2. 缩略形式如”dont”,…

机器学习-线性回归模型python demo

文章目录 前言机器学习-线性回归模型python demo1. 准备工作2. 实施2.1. 准备样本数据2.2. 创建线性回归模型2.3. 预测新的房价 3. 散点图、线形图 完整demo 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不…

【Python】已解决:Python读取字典查询键报错“KeyError: ‘d‘”

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:Python读取字典查询键报错“KeyError: ‘d’” 一、分析问题背景 在Python编程中,字典(dictionary)是一种非常重要的数据结构…

要在服务器上部署SSM(Spring, Spring MVC, MyBatis的组合

首先需要一台运行Ubuntu的服务器。下面是如何下载和安装Ubuntu的步骤: 一、下载Ubuntu ISO镜像 1. 访问Ubuntu官方网站: • 打开浏览器,进入Ubuntu的官方网站。 • 选择适合的Ubuntu版本下载,一般选择LTS(长期支持版…

静态内部类局部内部类

静态内部类 创建静态内部类对象的格式:外部类名.内部类名 对象名new外部类名.内部类名(); 调用非静态方法的格式:先创建对象,用对象调用 调用静态方法的格式:外部类名.内部类名.方法名(&#…