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

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

  • 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避免避免避免发生

 
 
 
 
 
 
 
.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贝锐向日葵如何实现无人值守远程控制?

1.适用场景 (1)远程公司电脑应急办公(2)远程家里电脑游戏挂机(3)异地远程传输文件 2.操作步骤 (1)电脑安装向日葵个人版并登录贝锐账号(点击注册)&#xf…

Python - GFPGAN + MoviePy 提高人物视频画质

目录 一.引言 二.gif_to_png 三.gfp_gan 四.png_to_gif 五.总结 一.引言 前面我们介绍了 GFP-GAN 提高人脸质量 与 OCR 提取视频台词、字幕,前者可以提高图像质量,后者可以从视频中抽帧,于是博主便想到了将二者进行结合并优化人物 GIF …

Web实验(总)

目录 网站需求: 思路: 实验步骤: 第一步:准备工作 第二步:新建一个存储网页的目录 第三步:修改本地hosts映射 第四步:修改配置文件,建立基于http服务的网站 1)创建用户song和…

Misc | bucket 第二届“奇安信”杯网络安全技能竞赛

题目描述: 解密Base全家桶。 密文: 下载附件,解压得到一个txt文本,打开如下。 3441344134363435344435323442344534423441343635353334353333323442343935413442353434393535354135333441344534353536353535333332353534413436…

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

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

华为防火墙双机热备配置案例(无vrrp)

思路: IP和路由、ospf要两台防火墙单配,hrp不会同步 其它zone和策略会同步,只在master上配就行了 FW_A主要配置: hrp enable hrp interface GigabitEthernet1/0/2 remote 172.16.0.2 interface GigabitEthernet1/0/0 undo shut…

CAD Exchanger SDK 有什么新内容?

CAD 交换器 3.23.0,2023 年 11 月强调:- 添加了新版本格式的导入:Autodesk Inventor 2023 和 2024、NX 2306。- 文档经过重大修改,使其更易于导航。它也是现在包含有关 SDK、Web Toolkit 和 Manufacturing Toolkit 的全面信息&…

4.运行时数据区

目录 概述堆虚拟机栈栈帧当前栈帧创建栈帧栈异常的两种情况 本地方法栈方法区方法区存储永久代和元空间的区别 结束 概述 整个 jvm 构成里,主要由三部分组成:类加载系统、运行时数据区、执行引擎。 由上图总结如下。 按照线程使用情况和职责分成两大类&…

sqli-labs关卡13(基于post提交的单引号加括号的报错盲注)通关思路

文章目录 前言一、回顾第十二关知识点二、靶场第十三关通关思路1、判断注入点2、爆显位3、爆数据库名4、爆数据库表5、爆数据库列6、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识,禁止用于做非法攻击。注意靶场是可以练习的平台,…

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

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

什么是Vue.js的计算属性(computed properties)?与方法(methods)有什么不同?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

GetSimple CMS 忘记密码

GetSimple CMS是一个超简单的 CMS,适合建立个人网站等只需要极少数页面的网站。在站长百科上,是这么说的: GetSimple是一款基于XML存储数据的开源内容管理系统,且易于安装和定制,无需MySQL支持。提供撤销保护和备份功能…

有效找回误删照片的 6 种照片数据恢复软件!

照片是珍惜过去珍贵时刻的唯一方式。它们让记忆永存,帮助我们重温生命中最美好的时刻。但是,当这些时刻丢失时会发生什么?您是否曾经因系统崩溃而意外删除或丢失照片?丢失照片可能令人心碎,但仍有希望,因为…

k8s的Init Containers容器实现代码版本升级发布和deployment版本回退:实战操作版

Pod中的初始化容器:Init Containers initContainers实现理论前提:同一个Pod内的容器共享 网络、volume等资源 Init Containers 在Kubernetes中,init容器是在同一个Pod中的其他容器之前启动和执行的容器。它的目的是为Pod上托管的主应用程序执行初始化…

最新支付宝扫码跳转到发红包技术(含效果演示)

需要了解该技术的可以通过联系:https://m.hlcode.cn/?idNK1f1gt

Misc | 相当于签到 第二届“奇安信”杯网络安全技能竞赛

题目描述: 图片似乎经过了什么处理,你能否将其复原呢? 密文: 下载附件,解压得到一张.jpg图片。 解题思路: 1、一张图片,典型的图片隐写。放到Kali中,使用binwalk检测,确…

AI生成PPT工具——Gamma,结合GPT生成不错的效果

AI生成PPT工具——Gamma,结合GPT生成不错的效果 先告诉GPT我现在要参加一个比赛,请他帮忙梳理一下内容。当然整个过程需要不断调整,GPT生成的内容也不是一次就是最好的 不断调整之后让其列出提纲即可,如下: 紧接着我们…

Linux系统进行进程管理,用户管理,文件压缩命令

目录 1.gcc与g区别(补充了解) 2.进程管理命令 3.用户管理命令 4.文件压缩与解压命令 5.常见面试题目 1.gcc与g区别(补充了解) 比如有两个文件:main.c,mainc.cpp(分别用C语言和C语言写的)如果要用gcc编译呢? gcc -o mainc main.c gcc -o mainc mainc.cpp -lstdc 指明用c的…

CAD转换器:CAD Exchanger SDK --Crack

转换器 目录 概述读取文件 增量加载写入文件格式特定的详细信息进度状态支持例子 读取和写入多种 CAD 和 BIM 文件格式。 概述 读取(导入)和写入(导出)文件是使用 CAD Exchanger SDK 时的主流场景。支持的格式列表可在此处获取。 …

HTML-fieldset与legend的使用

fieldset 可以对表单组件进行分组 legend 可以对分组进行命名 效果&#xff1a; 源码&#xff1a; <form action""><fieldset><legend>主要信息</legend><!-- 第一种方法:用id的方式绑定账户(文字)和输入框 --><label for"z…