spring事务那些事

实际工作中还会面临千奇百怪的问题,看下面返个例子(注意MySql数据库测试):

//1.hello1Service 调用 hello2Service
@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public void doUpdate() {//执行的sql:update demo_user set name = concat(name ,'_1') where logonid = 1 hello2Service.doUpdate();
}
//2.hello2Service
@Transactional(propagation = Propagation.REQUIRES_NEW,rollbackFor = Exception.class)
public void doNewUpdate() throws Exception {// 执 行 的 sql 语 句 : update demo_user set name =concat(name ,'_2') where logonid = 2userDao.doUpdate2(); // 异 常,Lock waittimeout exceeded; try restarting transaction

这个是怎么回亊,两个sql语句没有修改同一行数据?怎么一个数据提交,另一个出现莫名其妙的错误?

此外框架还支持doNest*主子亊务,那么对主子亊务要怎么理解呢?

下面就和大家交流下我对这些方面的内容总结。

事务的传播定义

下面列举了各公司框架使用到的亊务传播部分说明,还有些不常用传播行为,因为实际使用的少,大家在网上了解下就行了。

传播行为意义
PROPAGATION_REQUIRED表示当前方法必须运行在一个事务中,如果当前存在一个事务,那么该方法运行在这个事务中,否则,将创建一个新的事务
PROPAGATION_REQUIRES_NEW新建事务,表示当前方法必须运行在自己的事务中,如果当前存在一个事务,那么这个事务将在该方法运行期间被挂起
PROPAGATION_NESTED表示如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和PROPAGATION_REQUIRED看起来没什么俩样

主子事务存在嵌套行为,嵌套是子事务套在父事务的一部分,在进入事务之前,父事务建立一个回滚点,叫save point,然后执行子亊务,这个子亊务的执行也算是父亊务的一部分,然后子亊务执行结束,父亊务继续执行。重点就在二那个save point。下面癿几个问题加深下大家的理解,对二嵌套亊务问题说明:
【1】如果子亊务回滚,会发生什么? 父亊务会回滚到进入子亊务前建立的save point,然后尝试其它的亊务或者其他的业务逻辑,父事务之前的操作不会受到影响,更不会自动回滚。
【2】如果父亊务回滚,会収生什么? 父亊务回滚,子亊务也会跟着回滚!为什么呢,因为父亊务结束之前,子亊务是不会提交的,我们说子亊务是父亊务的一部分,正是这个道理。
【3】亊务癿提交癿顺序什么? 父亊务先提交,然后子亊务提交,还是子亊务先提交,父亊务再提交?还是那句话,子亊务是父亊务的一部分,由父亊务统一提交。

事务的影响因子

【1】亊务的拦截边界: Spring亊务默认情况下都是在抛出unchecked exception后才会触发亊务的回滚

@Transactional(propagation = Propagation.REQUIRED)
@Override
public void doUpdate() throws Exception {userDao.doUpdate();//数据会提交throw new Exception("11");
}

Exceptionchecked exception,上述例子虽然抛出了异常,但数据仍然提交成功。

@Transactional(propagation = Propaga-tion.REQUIRED,rollbackFor = Exception.class)
@Override
public void doUpdate() throws Exception {userDao.doUpdate();//数据会回滚throw new Exception("11");
}

rollbackFor = Exception.class指定了亊务的拦截边界,但是大家思考下,如果抛出的是Throwable类型呢?也是一样会提交亊务。公司框架定义的异常捕获边界也都是Exception的,这点一定要注意。

【2】如果是边界内癿异常,但是被捕获了呢?

@Transactional(propagation = Propaga-tion.REQUIRED,rollbackFor = Exception.class)
@Override
public void doUpdate() {try {userDao.doUpdate(); //数据会提交throw new RuntimeException("roll");} catch (Exception e) {e.printStackTrace();}
}
@Transactional(propagation = Propaga-tion.REQUIRES_NEW,rollbackFor = Excep-tion.class)
@Override
public void doNewUpdate() {try {userDao.doUpdate(); //数据会提交throw new RuntimeException("roll");} catch (Exception e) {e.printStackTrace();}
}

上例两种不同的传播行为,最织结果数据都提交了。

spring的亊务边界是在调用业务方法之前开始,并在你的业务方法中没有catch到的话,亊务会回滚。

但是如果被catch的话,数据依然能够提交。一般不需要在业务方法中catch异常,如果非要catch,在做完你想做的工作后(比如关闭流操作等)一定要抛出exception,否则spring会将你的操作commit,这样就会产生脏数据。

再回到开篇的第一个例子,原来我们发现数据库亊务本质上使用数据库锁,开启spring亊务意味着使用数据库锁。

这把锁定义的边界在数据库局面我们可以理解为数据库的隔离级别。

那么Spring对数据库隔离级别的支持如何?
Spring框架对数据库隔离级别提供了一定的支持。Spring事务管理器可以配置和控制数据库事务的隔离级别。通过Spring的事务管理器,您可以将隔离级别设置为读未提交READ_UNCOMMITTED、读已提交READ_COMMITTED、可重复读REPEATABLE_READ或串行化SERIALIZABLE。这样可以确保在并发访问数据库时,事务之间的隔离性得到维护。但具体的实现细节还是依赖于您所使用的具体数据库和驱动程序。

数据库的隔离级别有哪几种?
【1】读未提交(Read Uncommitted): 最低级别的隔离级别,允许一个事务读取另一个事务尚未提交的数据。这种隔离级别可能导致脏读(Dirty Read)问题。
【2】读已提交(Read Committed): 在一个事务读取数据时,只能读取已经提交的数据。这种隔离级别可以避免脏读,但可能会导致不可重复读Non-Repeatable Read问题。
【3】可重复读(Repeatable Read): 在一个事务读取数据时,保证多次读取同一数据时,读取的结果保持一致。这种隔离级别可以避免脏读和不可重复读,但可能会导致幻读Phantom Read问题。
【4】串行化(Serializable): 最高级别的隔离级别,通过对事务进行串行化执行,避免了脏读、不可重复读和幻读的问题。但这种隔离级别可能会导致并发性能下降。
这些隔离级别的选择取决于应用程序的需求和对数据一致性的要求。不同的数据库管理系统可能对隔离级别的实现有所不同。

什么是脏读、不可重复读、幻读?
脏读、不可重复读和幻读是数据库中的三种并发问题。
【1】脏读(Dirty Read): 一个事务读取到了另一个事务未提交的数据。如果另一个事务最终回滚,则当前事务读取到的数据是无效的。
【2】不可重复读(Non-Repeatable Read): 一个事务在读取数据时,由于其他事务的修改,导致多次读取同一数据时,读取的结果不一致。例如,一个事务在读取某个数据时,另一个事务修改了该数据并提交了事务,导致第一个事务读取到的数据与之前不同。
【3】幻读(Phantom Read): 一个事务在读取数据时,由于其他事务的插入或删除操作,导致多次读取同一范围的数据时,读取的结果不一致。例如,一个事务在读取某个表中的所有数据时,另一个事务插入了一条新的数据,导致第一个事务读取到的数据比之前多了一条。
这些并发问题的出现是由于多个事务同时访问数据库中的数据,而不同的隔离级别可以用来控制这些问题的出现。在选择隔离级别时,需要权衡数据一致性和并发性能。

Mysql或者Oracle默认的隔离级别是什么,如何查询?
MySQLOracle数据库的默认隔离级别是不同的。对于MySQL,默认的隔离级别是可重复读Repeatable Read。您可以使用以下命令查询当前MySQL数据库的隔离级别:

SELECT @@tx_isolation;

返回的结果应该是REPEATABLE-READ

对于Oracle,默认的隔离级别是读已提交Read Committed。您可以使用以下命令查询当前Oracle数据库的隔离级别:

SELECT * FROM v$transaction WHERE addr = (SELECT taddr FROM v$session WHERE sid = SYS_CONTEXT('USERENV', 'SID'));

返回的结果中的ISOLATION_LEVEL列应该是READ COMMITTED
请注意,这些查询语句可能需要在具有足够权限的用户下执行。
在这里插入图片描述

如果开篇例子的操作换成ORACLE数据库会出现同样的错吗?
建议大家动手操作理解,网上的那些概念背是没用的。

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

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

相关文章

【CHI】(十二)Memory Tagging

目录 1. Introduction 2. Message extensions 3. Tag coherency 4. Read transaction rules 4.1 TagOp values 4.2 Permitted initial MTE tag states 5. Write transactions 5.1 Permitted TagOp values 5.2 TagOp, TU, and tags relationship 6. Dataless transact…

Java 处理Mysql获取树形的数据

Mysql数据&#xff1a; 代码如下&#xff1a; Entity&#xff1a; Data Accessors(chain true) public class Region {private BigInteger id;//名称private String name;//父idprivate BigInteger parentId;private List<Region> children;private Integer createTim…

书生·浦语训练营二期第二次笔记

文章目录 1. 部署 InternLM2-Chat-1.8B 模型进行智能对话1.1 配置环境1.2 下载 InternLM2-Chat-1.8B 模型 2. 实战&#xff1a;部署实战营优秀作品 八戒-Chat-1.8B 模型2.1 配置基础环境2.2 使用 git 命令来获得仓库内的 Demo 文件&#xff1a;2.3 下载运行 Chat-八戒 Demo 3. …

Vue2 —— 学习(二)

shsh一、绑定 class 样式 &#xff08;一&#xff09;字符串写法 1.流程介绍 适用于样式的类名不确定 需要动态指定 通过 指令绑定的形式&#xff0c;在模板中的类标签绑定 Vue 实例中的数据 mood <div class"basic" :class"mood" click"chang…

AutoAlignV2:基于可变形特征聚合的动态多模态3D目标检测

AutoAlignV2 Deformable Feature Aggregation for Dynamic Multi-Modal 3D Object Detection 论文网址&#xff1a;AutoAlignV2 论文代码&#xff1a;AutoAlignV2 简读论文 这篇论文提出了一种名为AutoAlignV2的动态多模态3D目标检测框架,旨在高效融合激光雷达点云和RGB图像…

双目运算符和单目运算符的重载

目录 题目 源码 结果示例 题目 建立一个矩阵类&#xff0c;可以完成指定的操作或运算。 说明&#xff1a; 矩阵为2行3列&#xff0c;基类型为整型&#xff1b;操作或运算&#xff1a;初始化&#xff08;>>&#xff09;、输出&#xff08;<<&#xff09;、赋值…

2024年网络安全趋势前瞻:从AI攻击到云安全新挑战

随着2024年开展新的序幕&#xff0c;网络安全领域正面临着前所未有的挑战与机遇&#xff0c;一系列引人注目的趋势和预测逐渐浮出水面。 一、AI技术发展引发的安全问题 近年来&#xff0c;我们见证了AI技术的飞速进步&#xff0c;其中ChatGPT等引领潮流的AI服务成为公众瞩目的…

数据结构__顺序表

概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改 需要用到数组&#xff1a;数组的绝对优势&#xff1a;下标的随机访问&#xff08;因为物理空间连续&#xff09; a[i]等…

git 常用命令和使用方法

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

IoT数采平台4:测试

IoT数采平台1&#xff1a;开篇IoT数采平台2&#xff1a;文档IoT数采平台3&#xff1a;功能IoT数采平台4&#xff1a;测试 Modbus RTU串口测试 OPC测试 HTTP测试 MQTT透传测试 MQTT网关测试及数据上报 TCP / UDP 监听&#xff0c;客户端连上后发送信息&#xff0c;客户端上报数据…

Linux从入门到精通 --- 4(下).网络请求和下载、端口、进程管理、主机状态监控、环境变量、文件的上传和下载、压缩和解压

文章目录 第四章(下)&#xff1a;4.8 网络请求和下载4.8.1 ping4.8.2 wget4.8.3 curl 4.9 端口4.9.1 查看端口占用 4.10 进程管理4.10.1 查看进程4.10.2 查看指定进程4.10.3 关闭进程 4.11 主机状态监控4.11.1 查看系统资源占用4.11.2 top交互式选项4.11.3 磁盘信息监控4.11.4 …

uniapp-设置UrlSchemes从外部浏览器H5打开app

需求&#xff1a;外部浏览器H5页面&#xff0c;跳转到uniapp开发的原生app内部。 1、uniapp内部的配置&#xff1a; &#xff08;1&#xff09;打开manifest->App常用其他设置&#xff0c;如下&#xff0c;按照提示输入您要设置的urlSchemes&#xff1a; &#xff08;2&am…

数据库关系模式三元及以上分解无损连接判断(表格法)

例题 1.首先构造初始表&#xff0c;如下表所示。 A B C D E ABC a1 a2 a3 b14 b15 CD b21 b22 a3 a4 b15 DE b31 b32 b33 a4 a5 2.遍历函数依赖&#xff0c;对AB→C&#xff0c;因各元组的第一、二列没有相同的分量&#xff0c;所以表不改变。 3.由C→D…

MacOS Docker 部署 Redis 数据库

一、简介 Redis是一个开源的、使用C语言编写的、基于内存亦可持久化的Key-Value数据库&#xff0c;它提供了多种语言的API&#xff0c;并支持网络交互。Redis的数据存储在内存中&#xff0c;因此其读写速度非常快&#xff0c;每秒可以处理超过10万次读写操作&#xff0c;是已知…

Java设计模式—策略模式(商场打折)

策略这个词应该怎么理解&#xff0c;打个比方说&#xff0c;我们出门的时候会选择不同的出行方式&#xff0c;比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等&#xff0c;这些出行方式&#xff0c;每一种都是一个策略。 再比如我们去逛商场&#xff0c;商场现在正在搞活动&…

面试总结------2024/04/04---项目

1.面试官提问&#xff1a;你说你在项目中使用springsecurity jwt 实现了登录功能&#xff0c;能简单讲一下怎么实现的吗&#xff1f; 2.使用RabbitMQ实现订单超时取消功能 redis实现的劣势 订单状态定义 首先&#xff0c;我们需要定义订单的不同状态。在这个示例中&#xf…

深入解析template,掌握C++模板的精髓!

掌握C模板&#xff08;template&#xff09;的优雅之道&#xff01; 一、什么是模板&#xff1f;二、模板如何工作&#xff1f;三、C 中的模板类型3.1、 类模板3.2、 函数模板 四、模板参数推导4.1、模板参数推导示例4.2、函数模板参数推导4.3、类模板参数推导&#xff08;C17 …

vivado 配置存储器器件编程2

为双 QSPI (x8) 器件创建配置存储器文件 您可使用 write_cfgmem Tcl 命令来为双 QSPI (x8) 器件生成 .mcs 镜像。此命令会将配置数据自动拆分为 2 个独立 的 .mcs 文件。 注释 &#xff1a; 为 SPIx8 生成 .mcs 时指定的大小即为这 2 个四通道闪存器件的总大小。…

缓存雪崩以及解决思路

缓存雪崩&#xff1a;缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 解决方案&#xff1a; 给不同的Key的TTL添加随机值 利用Redis集群提高服务的可用性 给缓存业务添加降级限流策略 给业务…

HarmonyOS实战开发DLP-如何实现一个安全类App。

介绍 本示例是一个安全类App&#xff0c;使用ohos.dlpPermission 接口展示了在eTS中普通文件加密受限的过程。 效果预览 使用说明: 1.启动应用后点击“”按钮可以添加一个普通文件; 2.长按点击加密按钮&#xff0c;出现加密权限弹窗&#xff0c;选择需要设置的权限并点击确定…