确定能搞懂:脏读、读已提交、可重复读、幻读?_weixin_34273046的博客-程序员宅基地

今天刚好在看某个公众号中提到了这个知识点,发现对这块的解释不是很到位,尤其是对幻读这块的解释,很多文章都是相互复制粘贴,所以我们看到的大部分解释都是类似的,很多人对幻读这款不是很理解,让看的人云里雾里、晕晕乎乎,所以拿出来说明一下;大家也可以留言,相互交流。

主要内容

本文以mysqlsql为例,介绍如下内容:
1、什么是脏读?
2、什么是读已提交?
3、什么是可重复读?
4、什么是幻读?

脏读、读已提交、可重复读、幻读都是和事务隔离级别相关的一些东西,所以需要大家先理解事务相关的一些概念。

什么是事务?

我们这里所说的事务大多数是指数据的事务,事务是指一个业务操作,一个业务操作内部包含多个小的子操作,这些操作要目全部一起执行成功,要么全部执行失败,不存在说一部分成功一部分失败的情况。

事务有以下特性(ACID)
1、原子性(Atomicity)
事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

2、一致性(Consistency)
事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。

3、隔离性(Isolation)
多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

4、持久性(Durability)
已被提交的事务对数据库的修改应该永久保存在数据库中

何为脏读?

一个事务在执行的过程中读取到了其他事务还没有提交的数据。
这个还是比较好理解的。

何为读已提交

从字面上我们就可以理解,即一个事务操作过程中可以读取到其他事务已经提交的数据。

事务中的每次读取操作,读取到的都是数据库中其他事务已提交的最新的数据(相当于当前读)

何为可重复读

一个事务操作中对于一个读取操作不管多少次,读取到的结果都是一样的。

可重复读中有种情况需要注意
如,事务A:
1、打开事务
2、select count(id) from t_a,返回10行
3、向A表插入一条记录
4、select count(id) from t_a,返回11行
5、提交事务

有疑问?
上面不是说可重复读不管读取多少次,结果都是一样的,这个地方为什么不一样呢?
可重复读是指对于其他事务操作的数据,多次读取的结果都是一样的,重点在于其他事务的数据,如果第一次读取能够读取到其他事务的数据,后面不管其他事务有任何其他任何操作,都不会影响已读取到的其他事务产生的数据。但是自己所在的事务中产生的数据,自己是都可以读取到的。

何为幻读

脏读、不可重复读、可重复读、幻读,其中最难理解的是幻读

以mysql为例:

幻读在可重复读的模式下才会出现,其他隔离级别中不会出现

幻读现象例子:
可重复读模式下,比如有个用户表,手机号码为主键,有两个事物进行如下操作

事务A操作如下:
1、打开事务
2、查询号码为X的记录,不存在
3、插入号码为X的数据,插入报错(为什么会报错,先向下看)
4、查询号码为X的记录,发现还是不存在(由于是可重复读,所以读取记录X还是不存在的)

事物B操作:在事务A第2步操作时插入了一条X的记录,所以会导致A中第3步插入报错(违反了唯一约束)

上面操作对A来说就像发生了幻觉一样,明明查询X(A中第二步、第四步)不存在,但却无法插入成功

幻读可以这么理解:事务中后面的操作(插入号码X)需要上面的读取操作(查询号码X的记录)提供支持,但读取操作却不能支持下面的操作时产生的错误,就像发生了幻觉一样。

十年java老兵,只生产干货,公众号:路人甲Java,微信号:itsoku

转载于:https://blog.51cto.com/4217431/2397823

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34273046/article/details/92172167

智能推荐

1月9日学习内容整理:请求库requests之基于GET和POST请求,response对象的属性_weixin_34204722的博客-程序员宅基地

Requests模块介绍:#介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)#注意:requests库发送请求将网页内容下载下来以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求#安装:pip3 install requests#各种请求方式:...

上手华为软开云DevOps前后端分离实践之-后端SpringBoot_Heartsuit的博客-程序员宅基地

简介华为软开云主要目的是为企业提供一套`DevOps`(即开发运维)的云端解决方案,包括项目管理、代码仓库、编译构建、部署发布、流水线,甚至`CloudIDE`,实现云端的开发与维护。这里我们先忽略华为软开云的项目管理功能(`Scrum`,看板里的需求规划、任务指派、工时分配),测试功能,文档管理功能,CloudIDE等;重点关注`项目创建、代码托管、编译构建、部署、发布以及流水线功能`;同时...

Java反射获取字段、设置字段以及获取字段的值_java反射设置字段值_缘聚则合缘灭则散的博客-程序员宅基地

Java反射获取字段、设置字段以及获取字段的值获取字段1.先找到字段所在类的字节码2.找到需要被获取的字段Class类中获取字段:public Field[] getFields();//获取包括自身和继承(实现)过来的所有的public字段——Field不支持泛型<>,即后面不接<>public Field[] getDeclaredFields(...

uniapp调试 未检测到手机或模拟器_A_Brave的博客-程序员宅基地

1. 打开HBuilder X安装目录,找到adbs目录2.把1.0.31里面的文件复制一份,粘贴覆盖adb目录下的文件覆盖前可以先备份一下除文件夹以外adb里面的文件3.重启HBuilder X和编辑器 重启之后点击要运行的项目,运行查看(刚重启之后建议稍等一下,检测设备会有延迟)...

GC日志分析示例_穿过午夜的博客-程序员宅基地

1.准备工作 1.1.应用程序GCQuerySampleApplication.jar代码如下:/** * 模拟用户请求 * 设定最大内存1024m * 每100毫秒创建100个线程,每个线程创建一个1mb的对象,最多一秒同时存在1000线程,最多占用内存1024MB(100%) * 对象存活在1秒左右的场景,远远超过平时接口的响应时间要求,场景应该为吞吐量优先 *...

看不见的,就是不存在么?_前端队长Daotin的博客-程序员宅基地

大家好,我是前端队长Daotin ~最近断断续续在微信读书把《平面国》这本书读完了,以前我很少有兴趣能完整读完一本书,但是这本小书不长,但是内容很有意思,最终在花了三个半小时后读完了。最开...

随便推点

centos7安装配置samba_vfdn的博客-程序员宅基地

1、安装samba执行yum -y install samba2、配置sambamkdir -p samba/share 创建共享目录chmod 777 /samba/share/ 设置目录权限,否则windows下访问不能修改修改samba配置文件:cd /etc/samba/ 定位到配置文件目录cp smb.conf smb.conf.ba...

Hyper-V虚拟机安装Ubuntu,启动的时候会出现:Please remove the installation medium,then press ENTER..._weixin_38170065的博客-程序员宅基地

Hyper-V虚拟机安装Ubuntu成功以后,重启的时候页面会一直卡在下面,并报Please remove the installation medium,then press ENTER,这是因为启动默认是从CD/DVD启动,所以才导致了这样的问题。解决方法:先关闭正在启动的Ubuntu,如果强制关闭也无法关闭,那么先等一段时间以后,再强制关闭就可以了,然后打开Hyper-...

uniapp 二维码或图片转成base64格式并分享到qq或微信_兄弟连勇闯天涯的博客-程序员宅基地

断断续续的搞了两次,终于把这个功能实现了。1.二维码的插件2.转base64格式的工具(图像转换工具,可用于图像和base64的转换)3.uniapp安装// 以下路径需根据项目实际情况填写import { pathToBase64, base64ToPath } from '../../js/image-tools/index.js'4.pathToBase64从图像路径转...

RMAN-05501 RMAN-05001_aborting duplication of target database_Data & safety的博客-程序员宅基地

错误信息:RMAN-05501: aborting duplication of target databaseRMAN-05001: auxiliary file name /oracle/oradata/skatedb/tbs_statspack01.dbf conflicts with a file used by the target database在用rman duplicate创建dg的时候,抛出如上的错误,这里只列出用rman dumplicate的过程,具体操作步骤如下:.

电力系统潮流计算中的导纳矩阵计算,matlab源程序_潮流计算中导纳矩阵的计算 程序_山高一小的博客-程序员宅基地

电力系统导纳矩阵计算,MATLAB这学期在上大四专业选修课时,一个课后作业是写一个电力系统的导纳矩阵计算程序,我找了找资料肝了半天的程序如下图所示,希望能对大家有用。程序说明1.具有非标准变比的变压器处理如果变压器阻抗归算到非标准变比的K侧,则在参数输入脚本文件data中变压器参数第五列记为0;如果归算到非标准变比的1侧,则在参数输入脚本文件data中变压器参数第五列记为1。2.线路为双回线时,需要将两个节点之间线路阻抗减半,导纳加倍;同时,如果线路是双回线则在data线路参数中第五列记为1,否

使用ShaderGraph制作动漫人物眼睛部分_wakawaka555的博客-程序员宅基地

使用ShaderGraph制作动漫人物眼睛部分实现效果如下图:实现步骤:新建HDRP工程,创建Eye Graph(2019版还是处于预览版,正式项目慎用)节点图如下连接点这里就不详述了,官网上有详细的解释。2.人物模型使用资源为官方资源,百度链接如下:链接:https://pan.baidu.com/s/1K6SxpO7_PROLdAWKbPm5dw提取码:jkml3.新建Sample Texture 2D节点,然后创建两个Texture2D变量,分别显示眼睛和眼白图片:如上图所示,

推荐文章

热门文章

相关标签