并发事务下,不同隔离级别可能出现的问题

news2024/11/17 14:27:01

并发事务下,不同隔离级别可能出现的问题

  • 1、事务的 ACID
  • 2、并发事务下,不同隔离级别可能出现的问题
    • 2.1、脏写
    • 2.2、脏读
    • 2.3、不可重复读
    • 2.4、幻读
  • 3、SQL 中的四种隔离级别

1、事务的 ACID

 

    1. 原子性(Atomicity):原子性意味着事务是一个不可分割的最小工作单元,事务内的操作要么全部完成,要么全部不完成,不可能停滞在中间某个环节。也就是说,事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
    1. 一致性(Consistency):指事务必须使数据库从一个合法性状态,变换到另一个合法性状态。这里的状态是指数据满足完整性约束(如主键约束、外键约束、检查约束等)的状态,这里说的状态是语义上的,和具体业务有关。一致性就是保证事务执行后,数据库中的数据仍然是有意义的。
    1. 隔离性(Isolation):指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
    1. 持久性(Durability):一旦事务提交,则其结果永久保存在数据库中。即使系统发生故障,数据库也能将数据恢复到事务成功执行的状态。持久性是通过事务日志保证的。

在这里插入图片描述

数据库事务的状态通常包括以下几种:

  1. 活动状态(Active):事务正在执行,尚未提交或回滚。
  2. 部分提交状态(Partially Committed):事务中的一部分操作已经完成并提交,但其他操作还在执行中。
  3. 失败状态(Failed):事务执行失败,需要进行回滚操作。
  4. 成功状态(Succeeded):事务执行成功,所有的操作都已经提交。
  5. 中止状态(Aborted):事务在执行过程中被中断,比如由于系统故障或者数据库故障。

 

2、并发事务下,不同隔离级别可能出现的问题

 
并发执行事务过程中,不同隔离级别下可能出现的问题

重要程度排序脏写 > 脏读 > 不可重复读 > 幻读

 

2.1、脏写

 
对于两个事务A、B,如果事务A 修改了 另一个未提交事务B 修改过的数据,那就是发生了脏写。以下示例,事务A已经提交成功,但是事务B回滚了,最终 no=1 的数据没有任何变化。

发生时间编号事务 A事务 B
begin;
begin;
update tb_table set name = ‘对对对’ where no = 1;
update tb_table set name = ‘错错错’ where no = 1;
commit;
rollback;

 

2.2、脏读

 
举例:对于两个事务A、B,事务A读取了已经被事务B 更新未被提交的数据,之后事务B 回滚了,事务A读取的内容就是临时且无效的。

发生时间编号事务 A事务 B
begin;
begin;
update tb_table set name = ‘对对对’ where no = 1;
select name from tb_table where no = 1; (发生脏读,这里读到name = ‘对对对’)
commit;
rollback;

 

2.3、不可重复读

 
举例:对于两个事务A、B,事务A读取了一个字段,然后事务B 更新了该字段,之后事务A再次读取同一个字段,值就不同了,这种情况就是不可重复读。

发生时间编号事务 A事务 B
begin;
select name from tb_table where no = 1; (这里读到name = ‘原始数据’)
begin;
update tb_table set name = ‘对对对’ where no = 1;
commit
select name from tb_table where no = 1; (发生不可重复读,这里读到name = ‘对对对’)
commit;

 

2.4、幻读

 
       对于两个事务A、B,事务A从一个表中读取了一个字段,然后事务B 在该表中插入了一些新的行。之后事务A 再次读取同一个表,就会多出几行数据,这就是幻读。幻读侧重的方面是某一次的select 操作得到的结果,所表征的数据状态无法支撑后续的业务操作。对于MySQL而言,幻读是事务在插入事先检测不存在的记录时,发现这条数据已经存在了,无法支撑后续的插入操作。

发生时间编号事务 A事务 B
begin;
select * from tb_table where no > 1; (这里读到了2条数据)
begin;
insert into tb_table values(4,‘测试’);
commit
select * from tb_table where no > 1; (发生幻读,这里读到了3条数据)
commit;

 
说明:

  • 以上第④步,如果删掉了id=2 的数据,导致第⑥步只读到1条数据,这种情况不算幻读。幻读强调的是一个事务按照某个相同条件多次读取记录时,后读取时读到了之前没有读到的记录
  • 对于先前已经读到的记录,之后又读取不到,这相当于对每条记录都发生了不可重复读的现象。

3、SQL 中的四种隔离级别

 
隔离级别越低,并发问题发生的就越多。 SQL 标准 中设立的 4 个隔离级别:

  • READ UNCOMMITTED读未提交,在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。不能避免脏读、不可重复读、幻读

  • READ COMMITTED读已提交,一个事务只能看到已经提交事务所做的改变。这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。可以避免脏读,但是**不可避免 不可重复读、幻读**。

  • REPEATABLE READ 可重复读(MySQL默认隔离级别),事务A 在读到一条数据后,此时事务B对该数据进行修改并提交,那么事务A再读该数据,读到的还是原来的内容。可以避免脏读、不可重复读,但是**不可避免幻读**。重点MySQL 在可重复读级别下,是可以禁止幻读的。

  • SERIALIZABLE可串行化,确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。可以避免所有的并发问题,但是**性能十分低下能避免脏读、不可重复读、幻读**。

不同的数据库厂商,对SQL标准中规定的四种隔离级别支持不一样。以下是 SQL 标准中规定(注意:这里不是 MySQL),对不同隔离级别下,并发事务可以发生不同严重程度的问题:

隔离级别脏读不可重复度幻读加锁读
READ UNCOMMITTED发生发生发生避免
READ COMMITTED避免发生发生避免
REPEATABLE READ 避免避免发生避免
SERIALIZABLE避免避免避免发生

 
 
 
 
 
 
 
.

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

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

相关文章

数据结构 | 栈的实现

数据结构 | 栈的实现 文章目录 数据结构 | 栈的实现栈的概念及结构栈的实现 Stack.h初始化栈入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空销毁栈 Stack.c 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。…

勘察设计考试公共基础之数学篇

1、数学 向量点积:向量叉积:平面的法向量为n(A,B,C),则该平面的点法式方程为: A(x-x0)B(y-y0)C(z-z0)0 两平…

爬虫,TLS指纹 剖析和绕过

当你欲爬取某网页的信息数据时,发现通过浏览器可正常访问,而通过代码请求失败,换了随机ua头IP等等都没什么用时,有可能识别了你的TLS指纹做了验证。 解决办法: 1、修改 源代码 2、使用第三方库 curl-cffi from curl…

【T690 之十一】基于方寸EVB2开发板,结合 Eclipse+gdb+gdbserver 调试 CCAT 的流程总结

目录 1. 准备工作1.1 Eclipse1.2 工程编译1.3 烧写固件 2. 创建工程2.1 搭建调试工程2.2 配置Dbug调试信息 3. 调试4. 手动调试过程4. 总结 备注: 1,假设您已对方寸微电子的T690系列芯片的使用方式都有了一定的了解,可以根据此文的配置进行Li…

3D模型人物换装系统二(优化材质球合批降低DrawCall)

3D模型人物换装系统 介绍原理合批材质对比没有合批材质核心代码完整代码修改总结 介绍 本文使用2018.4.4和2020.3.26进行的测试 本文没有考虑法线贴图合并的问题,因为生成法线贴图有点问题,放在下一篇文章解决在进行优化 如果这里不太明白换装的流程可以…

基于物理的多偏置射频大信号氮化镓HEMT建模和参数提取流程

标题:Physics-Based Multi-Bias RF Large-Signal GaN HEMT Modeling and Parameter Extraction Flow 来源:JOURNAL OF THE ELECTRON DEVICES SOCIETY 摘要 本文展示了一种一致的Al镓氮化物(AlGaN)/氮化镓(GaN&#x…

CSS省略号n行公式

记得改图中的n,这是你需要的几行省略号!复制中间的5行就行了。 .text {overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: n; //n为你想省略的行数,需要改-webkit-box-orient: vertical; } 这是…

卷积神经网络(1)

目录 卷积 1 自定义二维卷积算子 2 自定义带步长和零填充的二维卷积算子 3 实现图像边缘检测 4 自定义卷积层算子和汇聚层算子 4.1 卷积算子 4.2 汇聚层算子 5 学习torch.nn.Conv2d()、torch.nn.MaxPool2d();torch.nn.avg_pool2d(),简要介绍使用方…

时间序列预测实战(十三)定制化数据集FNet模型实现滚动长期预测并可视化结果

论文地址->官方论文代码地址 官方代码地址->官方下载地址Github 个人修改代码地址-> 个人修改版本呢的下载地址CSDN 一、本文介绍 本博客将介绍一种新的时间序列预测模型——FNet,它通过使用傅里叶变换代替自注意力机制,旨在解决传统Transf…

瑞吉外卖Day03

小张推荐:瑞吉外卖Day02 1.启用/禁用员工账号 1.1 思路分析 1.2Controller层 PutMapping()public R<String> update(RequestBody Employee employee, HttpServletRequest request) {log.info(employee.toString());Long emp (Long) request.getSession().getAttribu…

AI毕业设计生成器(基于AI大模型技术开发)

这是一个辅助生成计算机毕业设计的工具&#xff0c;可以自动完成毕业设计的源码。它基于几百个github上面开源的java和python项目&#xff0c;运用tengsorflow技术&#xff0c;训练出了AI大模型。基本实现了计算机毕业设计生成器&#xff0c;能够初步生成Java或python基本源码。…

遇到问题,我该如何提问?

作为IT行业的从业者&#xff0c;我们深知程序员在保障系统安全、数据防护以及网络稳定方面所起到的重要作用。他们是现代社会的护城河&#xff0c;用代码构筑着我们的未来。那程序员的护城河又是什么呢&#xff1f;是技术能力的深度&#xff1f;是对创新的追求&#xff1f;还是…

一些分享| 在线笔记、GIF图片生成方法

文章目录 在线笔记视频转GIF 本片博客旨在挖掘一些好用且免费的在线平台&#xff0c;持续更新中~ 正所谓科技解放双手&#xff0c;使用在线平台可以方便快捷地学习办公&#xff0c;节省时间。 在线笔记 语雀 https://www.yuque.com/dashboard 语雀是笔者用得最长最久的平台了…

Pandas教程(非常详细)(第五部分)

接着Pandas教程&#xff08;非常详细&#xff09;&#xff08;第四部分&#xff09;&#xff0c;继续讲述。 二十五、Pandas sample随机抽样 随机抽样&#xff0c;是统计学中常用的一种方法&#xff0c;它可以帮助我们从大量的数据中快速地构建出一组数据分析模型。在 Pandas…

2.5 CE修改器:寻找数值指针

上一步阐述了如何使用代码替换功能对付变化位置的数据地址&#xff0c;但这种方法往往不能达到预期的效果&#xff0c;所以我们需要学习如何利用指针&#xff0c;在本关的Tutorial.exe窗口下面有两个按钮&#xff0c;一个会改变数值&#xff0c;另一个不但能改变数值而且还会改…

初始MySQL(四)(查询加强练习,多表查询)

目录 查询加强 where加强 order by加强 group by 分页查询 总结 多表查询(重点) 笛卡尔集及其过滤 自连接 子查询 子查询当作临时表 all/any 多列子查询 #先创建三张表 #第一张表 CREATE TABLE dept(deptno MEDIUMINT NOT NULL DEFAULT 0,dname VARCHAR(20) NOT …

js随机生成颜色

封装一个函数 返回一个随机颜色 不传参数或者传true返回十六进制&#xff0c; 传false返回rgb模式 script>function Random(n, m) {if (n > m) {let temp nn mm temp}return Math.floor(Math.random() * (m - n 1)) n}function getRandomColor(flag true) {if (fl…

力扣第647题 回文子串 c++ 动态规划 双指针 附Java代码 注释解释版

题目 647. 回文子串 中等 相关标签 字符串 动态规划 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串…

【中国知名企业高管团队】系列66:老板ROBAM

昨天华研荟为您介绍了厨电领域的TOP企业——方太FOTILE的发展历程&#xff0c;以及作为企一代茅理翔和企二代茅忠群的创业故事。 今天为您介绍同处浙江的老板电器。 一、关于老板电器 以下内容来自老板电器官网介绍&#xff1a; 杭州老板电器股份有限公司创立于1979年&…

学校教的Python根本不够!来看看Python学习路线图

如果只靠学校学的东西去找工作&#xff0c;能找到工作吗&#xff1f; 今天给大家看一个粉丝的真实求职案例&#xff0c;想做Python方面的工作&#xff0c;投了二十几个简历却没人要&#xff0c;心态崩了。为什么没人要&#xff1f;我来告诉你答案。 然后我还会结合我的这些年的…