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

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

  • 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.hqwc.cn/news/171587.html

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

相关文章

『MySQL快速上手』-⑧-内置函数

文章目录 1.日期函数1.1 获得年月日1.2 获得时分秒1.3 获得时间戳1.4 在日期的基础上加日期1.5 在日期的基础上减去时间1.6 计算两个日期之间相差多少天案例1案例22.字符串函数案例3.数学函数4.其他函数1.日期函数 1.1 获得年月日

电机应用-编码器

目录 编码器 增量式编码器 绝对式编码器 混合式绝对式编码器 旋转编码器原理 增量式编码器原理 绝对式编码器原理 编码器基本参数 分辨率 精度 最大响应频率 信号输出形式 编码器 用来测量机械旋转或位移的传感器,能够测量机械部件在旋转或直线运动时的…

Django视图函数和资源

文章目录 1.视图1.1 文件or文件夹1.2 相对和绝对导入urls1.3 视图参数1.4 返回值1.5 响应头1.6 FBV和CBV 2.静态资源2.1 静态文件2.2 媒体文件 1.视图 1.1 文件or文件夹 1.2 相对和绝对导入urls 注意实现:不要再项目根目录做相对导入。 原则: 绝对导入…

【社会网络分析第5期】gephi使用指南

gephi数据可视化 gephi数据可视化1、软件安装2、数据处理与导入(1)导入节点(2)导入边(3)改变节点的颜色(4)根据pagerank调整节点的大小(5)根据pagerank调整边…

Riskified: 2023年电商政策滥用问题恶化,正严重挑战商家盈利底线

2023年11月14日,中国上海 —— 近日,由全球领先的电子商务欺诈和风险智能解决方案提供商 Riskified 发布的《政策滥用及其对商家的影响:2023年全球参考基准》报告显示,政策滥用问题正进一步恶化,超过九成电商商家正在承…

2023年开发语言和数据库排行

2023年开发语言和数据库排行 一、开发语言相关1. Python1.1 Python优点1.2 Python缺点1.3 Python应用领域 2. C 语言2.1 C 语言优点2.2 C 语言缺点2.3 C语言应用领域 3. Java3.1 Java 优点3.2 Java缺点3.3 Java应用场景 4. C4.1 C 优点4.2 C 缺点4.3 C 应用场景 5. C#5.1 C# 优…

阿里巴巴将开源720亿参数大模型;开源语言大模型演进史

🦉 AI新闻 🚀 阿里巴巴将开源720亿参数大模型 摘要:在2023世界互联网大会乌镇峰会上,阿里巴巴集团CEO吴泳铭透露,阿里巴巴即将开源720亿参数大模型,这将是国内参数规模最大的开源大模型。目前&#xff0c…

C# 将PDF文档转换为Word文档

一.开发框架: .NetCore6.0 工具:Visual Studio 2022 二.思路: 1.使用SHA256Hash标识文档转换记录,数据库已经存在对应散列值,则直接返还已经转换过的文档 2.数据库没有对应散列值记录的话,则保存上传PDF…

Git的进阶操作,在idea中部署gie

🏅我是默,一个在CSDN分享笔记的博主。📚📚 ​​ 🌟在这里,我要推荐给大家我的专栏《git》。🎯🎯 🚀无论你是编程小白,还是有一定基础的程序员,这…

NTTRU:兼容 NTT 算法的 NTRU-based KEM 方案

参考文献: [CT65] Cooley J W, Tukey J W. An algorithm for the machine calculation of complex Fourier series[J]. Mathematics of computation, 1965, 19(90): 297-301.[Mont85] Montgomery P L. Modular multiplication without trial division[J]. Mathemat…

京东数据运营与分析:如何全面获取电商销售数据?

随着电商行业的快速发展,数据分析成为了电商运营中一个非常重要的环节,这一环往往能够帮助品牌方来提升销售业绩和管理效率。然而,如何获取到电商平台中详细、全面的销售数据是很多电商品牌方所关心的问题,事实上,第三…

海康威视嵌入式软件一面(技术面)

海康威视技术面试大部分都是基础问题和牛客上的问题,最后还有手撕代码部分也是牛客原题,总体中等偏难。 一、问答题 1.什么是野指针,野指针如何形成 【C语言基础】野指针与空指针_野指针和空指针-CSDN博客 2.const和static作用和区别 sta…