专栏首页路人甲Java确定能搞懂幻读?

确定能搞懂幻读?

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

主要内容

本文以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(javacode2018),作者:路人甲Java

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 小姐姐非要问我:spring编程式事务是啥?

    本文开始,大概用10篇左右的文章来详解spring中事务的使用,吃透spring事务。

    路人甲Java
  • 阿里3面:Spring声明式事务连环炮,让我措手不及。。

    这篇主要介绍声明式事务的用法,我们在工作中基本上用的都是声明式事务,所以这篇文章是比较重要的,建议各位打起精神,正式开始。

    路人甲Java
  • 玩转分布式事务系列 - 可靠消息解决跨库转账问题

    第7步执行成功之后,网络出问题了,第8步会提交失败,此时的结果是:A库资金减少了100,B库资金却没有增加;这是一个网络问题导致了我们业务失败了,网络因素是程序...

    路人甲Java
  • 【妙趣科学】社交网络如何改变我们的友谊

    美国前总统伍德罗·威尔逊说过:“友谊是令世界团结的唯一胶合剂。”一个世纪后的今天,这种胶合剂是否已经在快节奏、高科技、城市化的生活中失去了效力? 这一点可以从美...

    机器人网
  • 三种页面Loading页面加载效果【全屏】

    某些通过Ajax加载数据的页面,如果直接显示空白会给人突兀的感觉。如果加一个Loading的效果,会有大大不一样的效果哦。

    无道
  • 谈谈分布式事务之三: System.Transactions事务详解[上篇]

    在.NET 1.x中,我们基本是通过ADO.NET实现对不同数据库访问的事务。.NET 2.0为了带来了全新的事务编程模式,由于所有事务组件或者类型均定义在Sy...

    蒋金楠
  • 基于网络启动和系统服务劫持的渗透技术研究

    笔者受光盘启动WinPE系统修复主机原系统启发,设计并开展了以网络启动传输定制操作系统,实施自动化文件替换,劫持关键系统服务的渗透技术方案研究,实现了在内网环境...

    FB客服
  • 欧拉计划 Problem1

    题目 3的倍数和5的倍数 如果我们列出10以内所有3或5的倍数,我们将得到3、5、6和9,这些数的和是23。

    用户4492257
  • Ubuntu16.04双网卡主备配置

    前几日写了一篇Ubuntu14.04双网卡主备配置,没成想变化总是这么快,今日安装某软件,提示最匹配的ubuntu版本是16.04,作为一个码农能有什么办法,只...

    魏守峰
  • 数据库中的并发控制

    任何时候当有多个查询想要操作相同的数据的时候便会产生并发问题,而这很有可能会导致数据库陷入一种不一致的状态。如果恰好出现问题的数据是一批关键数据,那这个后果往往...

    水货程序员

扫码关注云+社区

领取腾讯云代金券