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

Spring事务的隔离级别

事务隔离级别解决的是多个事务同时调⽤⼀个数据库的问题

事务传播机制解决的是⼀个事务在多个节点(⽅法)中传递的问题

事务的特性:

隔离性:多个事务在并发执行的时候,多个事务执行的一个行为模式,当一个事务执行的时候,另一个事务执行的一个行为模式是什么?

1)A,原子性,一个事务中的所有操作,要么全部执行成功,要么全部执行失败,要么全部执行,要么全部不执行,不会结束在某一个中间环节,事务在执行的时候发生错误,会被回滚到事务执行之前的状态,就好像这个事务从来没有发生过一样

2)C,一致性在事务开启和事务结束之后,对数据库的完整性没有发生破坏,转账前后,总钱数没有发生变化,张三的钱数和李四钱数在转账前后的总钱数是不会发生改变的;

3)I,持久性,事务处理结束之后,对数据的修改就是持久的,数据永久地被存下来,关机重启之后也不会丢失,系统故障也不会丢失;

4)D,隔离性数据库允许多个并发事务同时对其数据进行读写和修改能力,隔离性可以防止多个事务并发由于交叉执行而导致数据的不一致,事务隔离分为四种级别,多个单个事务同时并发执行的时候,多个事务之间行为模式;

5)而事务的传播机制是指当一个程序调用链里面有多个方法的时候,多个方法进行相互调用的时候,多个方法又有自己的事务的时候,这就是嵌套事务,当程序中出现嵌套事务之后,嵌套事务的行为模式,Spring 事务传播机制定义了多个包含了事务的⽅法,相互调⽤时,事务是如何在这些法间进⾏传递;

一个讲的是列,是事务传播机制

一个讲的是行,是事务隔离级别

6)为什么要设置事务的隔离级别?

设置事务的隔离级别是为了保证多个并发事务执行更可控,更符合操作者预期的,事务的隔离级别就是为了说为了防止其他的事务影响到当前事务执行的一种策略

7)用咱们的CMD连接数据库:mysql -uroot -p(数据库的密码) 数据库名,在客户端执行这个操作就可以进行连接数据库了 

select @@global.tx_isolation,@@tx_isolation,查看当前隔离级别和系统默认隔离级别
@@global.tx_isolation这个就是系统默认的隔离级别,还有咱们的@@tx_isloaction是咱们的当前客户端的默认隔离级别

使用两个客户端来进行演示一下MYSQL的事务的四种隔离级别:

一:脏读问题(读未提交,就开始读):

这个对应MYSQL的隔离级别就是read uncommitted

1)表示读未提交,也叫做未提交读,该隔离级别的事务可以看到其他事务中没有提交的数据,而未提交的数据可能会发生回滚,我们就把一个事务读到别的事务没有提交的数据称之为脏数据因为该事务隔离级别可以看到其他事务没有提交的数据,我们把该隔离级别读到的数据称之为脏数据,把这个问题称之为脏读;

2)这个是指一个事务B读取到了另一个事务A未提交保存的数据,此后这个A事务进行了回滚操作,从而导致了B事务读到了一条不存在的脏数据,此时B事务读到的就是一个中间态的数据,B事务就可能会使用这条脏数据,但是后来A事务直接将事务回滚,该数据就不存在了;

3)我们是可以使用两个MYSQL客户端来进行演示的:

此时我们先将客户端A的事务隔离级别设置成读未提交,而B的客户端的默认隔离级别是系统默认的隔离级别:

执行客户端A客户端B
1set session transaction isolation level read uncommited
2start transaction
3start transaction
4insert into city values("西安")
5select * from city(此时我们读到一条数据,这个数据就是脏数据)
6rollback
7select * from city 啥也读不到

我们发现在我们的事务B新增数据进行完成回滚操作之后,我们的客户端A在进行我们此时在city表中是无法进行查询到任何数据的;

二)不可重复读问题(写完了读,读已提交):

但是从我的理解角度来说,同一个时间段不同的查询得到了不同的结果,但是读到的数据都是真实的在磁盘的上面进行修改了

2.1)这个时候一个事务不可以看到另一个事务未提交的数据了但是可以看到其他事务提交的结果,A事务和B事务在执行的时候,B未提交的数据A是看不到的;

2.2)我们在同一个事务中,同一个查询在不同的时间段内得到了不同的结果,假设咱们的事务在T1的时候读取到了某一行数据,我们在T2时间内再次重新读取到这一行的时候,这一行的数据我们发现此时已经被其他事务修改了;

执行客户端A客户端B
1set session transaction isolation level readcommited
2
3select * from city(查询到的是西安的数据)
4

start transaction

5

执行SQL语句:

update city set name="长安" where name="西安“

6commit
7select * from city(此时我们读到的数据是长安)

我们从上述结果中我们发现,客户端A被设置成了读已提交的事务隔离级别之后,使用相同的SQL两次进行读取到的同一条数据,内容是不一样的,这就是不可重复读,主要是针对修改操作来说的,在事务1读取的过程中可以读到其他事务提交的结果;

总结:该隔离级别的事务能读到已经提交事务的数据,因此他不会出现脏读问题,但是在事务执行的过程中可以读到其他事务提交的结果,所以在不同的时间的相同的SQL查询的时候,可能会得到不同的结果;

三:幻读问题:同一个查询在不同时间内出现了不同的结果

1)这就是事务中的幻读问题,咱们举个例子来说,当我们开启事务之后,我们执行第一次select,我们进行查询出来了一条语句,就类似于幻觉;

2)但是当我们再次执行第二次Select查询之后,我们查询到了两行,第二次返回了第一次的·select查询没有进行返回的一行,这一行就类似于幻想行,下面我们举个例子来理解一下:

步骤        客户端A客户端B
1set session transaction isolaction level repeatable read
2start transaction
3select * from city where id<5
4start transaction
5insert into city city(id,name) values(2,北京);
6commit
7update city set name="京城” where id=2
8select * from city where id<5

从上述执行流程来看,我们最后一条查询语句,查出了两条数据,客户端A一开始就设置了可重复读的事务隔离级别之后,使用相同的SQL却查询出来了不一样的结果,第一次查询出了一条数据,第二行却查询出了两条数据,多出来的这条数据就叫做幻象行,所以说在可重复读的情况下可能会出现幻读的问题;

最后总结:

1)脏读是读到了其他事务未提交的数据,不可重复读和幻读是已经读到了其他事务提交修改的数据,不可重复读是读到了其他事务修改的数据;

2)但是幻读是读取到了其他事务新增或者删除的幻象行数据;

3)幻读和不可重读描述的侧重点是不一样的,幻读描述的是新增或者删除操作,不可重复读描述的是修改操作的,会强制事务进行排序;

咱们Spring的事务隔离级别:解决的是多个事务共同调用数据库的问题

需要进行事务的隔离级别只需要进行设置@Transaction里面的isolation属性即可

@Transactional(isolation = Isolation.DEFAULT,timeout =60)

1)Isolation.DEFAULT:以连接的数据库的事务隔离级别为主,使用链接的对应数据库的隔离级别,如果使用MYSQL,那么事务隔离级别就是read committed;

2)Isolation.READ_UNCOMMITTED:读未提交,可以读到未提交的事务,是存在脏读的;

3)Isolation.READ_COMMITTED:读已经提交,只能读取到已经提交的事务,解决了脏读,但是还是存在着不可重复读的问题;

4)Isolation.REPEATABLE_READ:可重复读,解决了不可重复读的问题,但存在着幻读,这是MYSQL的一个默认隔离级别;

5)Isolation.SERIALIZABLE:这是串行化,可以解决所有的并发问题,但是性能太低,所有事务来了,串行执行,一个一个执行,直接就没有并发事务;

注意:

1)当Spring中设置了事务隔离级别和连接的数据库事务的隔离级别的发生冲突的时候,那么以Spring事务隔离级别为准;

2)当Spring中的事务隔离级别的实现是依靠连接数据库支持事务隔离级别的基础,比如说MYSQL5.1引擎是MYSIMMYSQL5.1默认时是不支持事务和事务隔离级别的时候,当MYSQL使用不支持事务的存储引擎的时候所以在程序里面是不支持事务和事务隔离级别的;

3)设置当前客户端的隔离级别:set session transaction isolation level +隔离级别;

1)可重复读:它能确保同一事务多次查询的结果一致,但也会有新的问题,比如此级别的事务正在执行时,另一个事务成功的插入了某条数据,但它每次查询的结果都是一样的,因为他已经解决了不可重复读的问题,虽然原有数据没有被修改,但是新增或者减少了数据;

2)所以会导致查询不到这条数据,自己重复插入时又失败,因为唯一约束的原因,明明在事务中查询不到这条信息,但自己就是插入不进去,这就叫幻读

3)串行化:会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多;

事务传播机制:

1)当有多个嵌套事务的时候,多个嵌套事务之间的行为模式,我是把所有小的事务当成一个大的事务,还是各自为正,还是一个方法有事务,一个方法没有事务,到底最终加不加事务,当有多个方法嵌套调用的时候,多个方法的行为模式;

2)当一个程序里面有多个方法的时候,多个方法在相互调用的时候,多个方法又同时有事务的时候,多个事务在相互调用的时候的一个行为模式

相关文章:

Spring事务的隔离级别

事务隔离级别解决的是多个事务同时调⽤⼀个数据库的问题 事务传播机制解决的是⼀个事务在多个节点(⽅法)中传递的问题 事务的特性: 隔离性:多个事务在并发执行的时候&#xff0c;多个事务执行的一个行为模式&#xff0c;当一个事务执行的时候&#xff0c;另一个事务执行的一个行…...

JVM系统优化实践(4):以支付系统为例

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;前面说过&#xff0c;JVM会将堆内存划分为年轻代、老年代两个区域。年轻代会将创建和使用完之后马上就要回收的对象放在里面&#xff0c;而老年代则将创建之后需要…...

16- TensorFlow实现线性回归和逻辑回归 (TensorFlow系列) (深度学习)

知识要点 线性回归要点: 生成线性数据: x np.linspace(0, 10, 20) np.random.rand(20)画点图: plt.scatter(x, y)TensorFlow定义变量: w tf.Variable(np.random.randn() * 0.02)tensor 转换为 numpy数组: b.numpy()定义优化器: optimizer tf.optimizers.SGD()定义损失: …...

无自动化测试系统设计方法论

灵活 敏捷 迭代。 自动化测试 辩思 测试必不可少 想想看没有充分测试的代码, 哪一次是一次过的? 哪一次不需要经历下测试的鞭挞? 不要以为软件代码容易改, 就对于质量不切实际的自信—那是自大! 不适用自动化测试的case 遗留系统。太多的依赖方, 不想用过多的mock > …...

架构初探-学习笔记

1 什么是架构 有关软件整体结构与组件的抽象描述&#xff0c;用于指导软件系统各个方面的设计。 1.1 单机架构 所有功能都实现在一个进程里&#xff0c;并部署在一台机器上。 1.2 单体架构 分布式部署单机架构 1.3 垂直应用架构 按应用垂直切分的单体架构 1.4 SOA架构 将…...

在成都想转行IT,选择什么专业比较好?

很多创新型的互联网服务公司的核心其实都是软件&#xff0c;创新的基础、运行的支撑都是软件。例如&#xff0c;软件应用到了出租车行业&#xff0c;就形成了巅覆行业的滴滴;软件应用到了金融领域&#xff0c;就形成互联网金融;软件运用到餐饮行业&#xff0c;就形成美团;软件运…...

【Spark分布式内存计算框架——Spark Streaming】4.入门案例(下)Streaming 工作原理

2.3 Streaming 工作原理 SparkStreaming处理流式数据时&#xff0c;按照时间间隔划分数据为微批次&#xff08;Micro-Batch&#xff09;&#xff0c;每批次数据当做RDD&#xff0c;再进行处理分析。 以上述词频统计WordCount程序为例&#xff0c;讲解Streaming工作原理。 创…...

2、算法先导---思维能力与工具

题目 碎纸片的拼接复原(2013B) 内容 破碎文件的拼接在司法物证复原、历史文献修复以及军事情报获取等领域都有着重要的应用。传统上&#xff0c;拼接复原工作需由人工完成&#xff0c;准确率较高&#xff0c;但效率很低。特别是当碎片数量巨大&#xff0c;人工拼接很难在短时…...

WordPress 函数:add_theme_support() 开启主题自定义功能(全面)

add_theme_support() 用于在我们的当前使用的主题添加一些特殊的功能&#xff0c;函数一般写在主题的functions.php文件中&#xff0c;当然也可以再插件中使用钩子来调用该函数&#xff0c;如果是挂在钩子上&#xff0c;那他必须挂在after_setup_theme钩子上&#xff0c;因为 i…...

Winform控件开发(16)——Timer(史上最全)

前言: Timer控件的作用是按用户定义的时间间隔引发事件的计时器,说的直白点就是,他就像一个定时炸弹一样到了一定时间就爆炸一次,区别在于定时炸弹炸完了就不会再次爆炸了,但是Timer这个计时器到了下一个固定时间还会触发一次,上面那张图片就是一个典型的计时器,该定时器…...

游戏高度可配置化:通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解

游戏高度可配置化&#xff1a;通数据引擎在模块化游戏开发中的应用构想图解 ygluu 码客 卢益贵 目录 一、前言 二、模块化与插件 1、常规模块化 2、插件式模块化&#xff08;插件开发&#xff09; 三、通用数据引擎理论与构成 1、名字系统&#xff08;数据类型&#xf…...

CountDownLatch与CyclicBarrier原理剖析

1.CountDownLatch 1.1 什么是CountDownLatch CountDownLatch是一个同步工具类&#xff0c;用来协调多个线程之间的同步&#xff0c;或者说起到线程之间的通信&#xff08;而不是用作互斥的作用&#xff09;。 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之…...

NLP中的对话机器人——预训练基准模型

引言 本文是七月在线《NLP中的对话机器人》的视频笔记&#xff0c;主要介绍FAQ问答型聊天机器人的实现。 场景二 上篇文章中我们解决了给定一个问题和一些回答&#xff0c;从中找到最佳回答的任务。 在场景二中&#xff0c;我们来实现&#xff1a; 给定新问题&#xff0c;从…...

C语言学习及复习笔记-【14】C文件读写

14 C文件读写 14.1打开文件 您可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件&#xff0c;这个调用会初始化类型 FILE 的一个对象&#xff0c;类型 FILE包含了所有用来控制流的必要的信息。下面是这个函数调用的原型&#xff1a; FILE *fopen( const char…...

模拟退火算法优化灰色

clc; clear; close all; warning off; %% tic T01000; % 初始温度 Tend1e-3; % 终止温度 L200; % 各温度下的迭代次数&#xff08;链长&#xff09; q0.9; %降温速率 X[16.4700 96.1000 16.4700 94.4400 20.0900 92.5400 22.3900 93.3700 25.…...

Pandas怎么添加数据列删除列

Pandas怎么添加数据列 1、直接赋值 # 1、直接赋值df.loc[:, "最高气温"] df["最高气温"].str.replace("℃", "").astype("int32")df.loc[:, "最低气温"] df["最低气温"].str.replace("℃"…...

C++类和对象:构造函数和析构函数

目录 一. 类的六个默认成员函数 二. 构造函数 2.1 什么是构造函数 2.2 编译器自动生成的默认构造函数 2.3 构造函数的特性总结 三. 析构函数 3.1 什么是析构函数 3.2 编译器自动生成的析构函数 3.3 析构函数的特性总结 一. 类的六个默认成员函数 对于任意一个C类&…...

【Stata】从入门到精通.零基础小白必学的教程,一学就fei

视频教程移步&#xff1a;https://www.bilibili.com/video/BV1hK4y1d714/?p4&spm_id_frompageDriver&vd_sourcecc8074e9c81a225f214226065db53d32P3 第二讲 Stata处理数据全流程&#xff08;上&#xff09; P3 - 01:37&#xfeff;内置数据 file example datasets使用…...

【RuoYi优化】调整JVM启动内存

📔 笔记介绍 大家好,千寻简笔记是一套全部开源的企业开发问题记录,毫无保留给个人及企业免费使用,我是作者星辰,笔记内容整理并发布,内容有误请指出,笔记源码已开源,前往Gitee搜索《chihiro-notes》,感谢您的阅读和关注。 作者各大平台直链: GitHub | Gitee | CSD…...

[架构模型]MVC模型详细介绍,并应用到unity中

简介&#xff1a; MVC模式是一种软件架构模式&#xff0c;它将应用程序分为三个主要部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;。MVC模式的目标是实现应用程序的松耦合&#xff0c;以便…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

Java中HashMap底层原理深度解析:从数据结构到红黑树优化

一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一&#xff0c;是基于哈希表的Map接口非同步实现。它允许使用null键和null值&#xff08;但只能有一个null键&#xff09;&#xff0c;并且不保证映射顺序的恒久不变。与Hashtable相比&#xff0c;Hash…...

Java中栈的多种实现类详解

Java中栈的多种实现类详解&#xff1a;Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...

VUE3 ref 和 useTemplateRef

使用ref来绑定和获取 页面 <headerNav ref"headerNavRef"></headerNav><div click"showRef" ref"buttonRef">refbutton</div>使用ref方法const后面的命名需要跟页面的ref值一样 const buttonRef ref(buttonRef) cons…...

Python[数据结构及算法 --- 栈]

一.栈的概念 在 Python 中&#xff0c;栈&#xff08;Stack&#xff09;是一种 “ 后进先出&#xff08;LIFO&#xff09;”的数据结构&#xff0c;仅允许在栈顶进行插入&#xff08;push&#xff09;和删除&#xff08;pop&#xff09;操作。 二.栈的抽象数据类型 1.抽象数…...

5. TypeScript 类型缩小

在 TypeScript 中&#xff0c;类型缩小&#xff08;Narrowing&#xff09;是指根据特定条件将变量的类型细化为更具体的过程。它帮助开发者编写更精确、更准确的代码&#xff0c;确保变量在运行时只以符合其类型的方式进行处理。 一、instanceof 缩小类型 TypeScript 中的 in…...