幻读和不可重复读的定义

事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据称为幻读。

如果事务A 按一定条件搜索, 期间事务B 删除了符合条件的某一条数据,导致事务A 再次读取时数据少了一条。这种情况归为不可重复读

这样来看幻读和不可重复读的原理是类似的,下面不再分开讲解。

准备工作

Mysql 隔离级别为 可重复读repeatable-read(RR)。

CREATE TABLE `author` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(255) DEFAULT NULL,

`age` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

INSERT into author VALUES

(1,'g1',20),(5,'g5',20),(15,'g15',30),(20,'g20',30);

示例

查找年龄为20岁的作者,并把姓名改成G20:

来分析下情形:

T1时刻 读取年龄为20的数据, Session1拿到了2条记录。

T2时刻 另一个进程Session2插入了一条新的记录,年龄也为20

T3时刻,Session1再次读取年龄为20的数据,发现还是2条数据,貌似 Session2新插入的数据并未影响到Session1的事务读取。

对于T1 -- T3 时刻的情形,从结果来看,在可重复度读隔离级别下似乎解决了幻读的问题。

T4时刻,Session1 修改年龄为20的数据, 发现影响行数为3条。 为什么T3时候只能查到2条数据,但现在修改却修改了3条数据?

T5时刻,Session1 再次读取年龄为20的数据,发现结果变成了3条,我们知道被修改的第三条就是Session2在T2时刻新增的一条。

T4,T5 的结果来看,Session1 读到了 Session2 新插入的数据。产生了幻读现象.

不是说隔离级别为可重复读是解决了幻读和不可重复读问题吗?

到底可重复读隔离级别下,解决了幻读问题没有?

了解过MVCC的同学,肯定知道或听说过当前读,和快照读。(不知道的同学,可以查找相关资料了解下,我们后面也会在mysql的事务机制和锁机制里面讲解MVCC)。首先要知道的是MVCC 就InnoDB 秒级建立数据快照的能力。 快照读就是读取数据的时候会根据一定规则读取事务可见版本的数据。 而当前读就是读取最新版本的数据。什么情况下使用的是快照读:(快照读,不会加锁)

一般的 select * from .... where ... 语句都是快照读

什么情况下使用的是当前读:(当前读,会在搜索的时候加锁)

select * from .... where ... for update

select * from .... where ... lock in share mode

update .... set .. where ...

delete from. . where ..

如果事务中都使用快照读,那么就不会产生幻读现象,但是快照读和当前读混用就会产生幻读。

如果都是使用当前读,能不能解决幻读问题?

先让我们数据恢复到初始状态:

TRUNCATE TABLE author;

INSERT into author VALUES

(1,'g1',20),(5,'g5',20),(15,'g15',30),(20,'g20',30);

可以看到Session 2 被阻塞了。需要等到Session1 提交事务后才能完成。当我们在事务中每次读取都使用当前读,也就是人工把InnoDB变成了串行化。一定程度上降低了并发性,但是也同样避免了幻读的情况。当前读为什么会阻塞新数据的插入,主要是间隙锁的加锁机制。(间隙锁在之前的INNODB的锁机制中已经讲过,for update会将整个表分为不同段进行锁定,这样任何的删除更新操作都会等待,直到锁被解除)。

总结了解幻读的定义。读到了其他事务新插入的数据,这种现象叫幻读,没有读到删除的数据为不可重复读,它们的机制类似。

引入当前读和快照读的区别,以及了解什么时候是快照读,什么时候是当前读

可重复读隔离级别下,一个事务中只使用当前读,或者只使用快照读都能避免幻读。

欢迎移步搜索关注公众号:互联网架构师之路(hlw_architector),获取最新架构材料。到底什么是mysql的幻读和不可重复读?​mp.weixin.qq.com

mysql可重复读_到底什么是mysql的幻读和不可重复读相关推荐

  1. java mysql不重复读写_数据库中的-脏读,幻读,不可重复读[转] - Java天空 - BlogJava...

    数据库带来的并发问题包括: 1.丢失或覆盖更新.(幻像读) 2.未确认的相关性(脏读). 3.不一致的分析(非重复读). 详细描述如下: 一.丢失更新 当两个或多个事务选择同一行,然后基于最初选定的值 ...

  2. mysql幻读和不可重复读的区别_面试官:MySQL的可重复读级别能解决幻读吗

    Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:宁愿. 来源:https://juejin.im/post/5c9040e95188252d92095a9e 引言 之前 ...

  3. mysql 幻读和不可重复读_幻读和不可重复读的区别

    MySQl MySql默认的隔离级别为Repeatable Read,因此只会出现幻读的情况. 幻读 事务在插入已经检查过不存在的记录时,惊奇的发现这些数据已经存在了,之前的检测获取到的数据如同鬼影一 ...

  4. mysql不可重复读和重复读_脏读、幻读、不可重复读的区别是什么

    脏读.幻读.不可重复读的区别:1.脏读就是指当一个事务正在访问数据,并且对数据进行了修改:2.不可重复读是指在一个事务内,多次读同一数据:3.幻读是指当事务不是独立执行时发生的一种现象. [相关学习推 ...

  5. 五分钟了解Mysql脏读、幻读、不可重复读、mvcc

    点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 首先对多事务并发的问题的思考 对 innodb引擎执行流程 和 buffer pool ...

  6. MySQL事务的四种隔离级别,mysql中的不可重复读和幻读的区别,Repeatable read可重复读隔离级别下怎么不存在幻读问题?

    1. 事务的隔离级别 1.1 read uncommited:读未提交.一个事务读到了另一个事务未提交的脏数据,称之为脏读. 1.2 read commited:读已提交.解决了脏读问题,但当前事务两 ...

  7. 为什么要避免不可重复读_脏读、幻读和不可重复读?为啥?

    前言: 一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏.这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性. 例子: 对银行转帐事务,不管事务成功还是失败,应该保证事 ...

  8. mysql不可重复读是锁的表吗,Mysql事务,并发问题,锁机制-- 幻读、不可重复读(转)...

    . 例如: 张三的工资为5000,事务A中获取工资为5000,事务B获取工资为5000,汇入100,并提交数据库,工资变为5100, 随后 事务A发生异常,回滚了,恢复张三的工资为5000,这样就导致 ...

  9. MySQL 幻读和不可重复读的区别

    背景 最近在学习 MySQL 的事务,幻读和不可重复读很容易搞混.故做此记录总结.先给出两者的定义. 不可重复读 如果一个事务修改了另一个未提交事务读取的数据,就意味着发生了不可重复读现象. r1[x ...

最新文章

  1. Django项目test中的mock概述
  2. 用LSTM实现英文写作
  3. python小课骗局-Python小课怎么样啊?
  4. 集合 Subset Sums
  5. lua与python结合_Lua和Python:实现一个高效的List对象(3)
  6. uni-app与Vue的区别
  7. 大话数据结构之算法 时间复杂度
  8. 安装和卸载C#写的 windows service
  9. vue 数组中嵌套数组_vue+element-ui表单校验之数组多层嵌套
  10. 夫曼编码译码系统课程设计实验报告(含源代码c++_c语言),哈夫曼编码译码系统课程设计实验报告(含源代码C++_C语言)[1]...
  11. Web 组件即将取代前端框架?!| 技术头条
  12. 蓝桥杯 ALGO-54 算法训练 简单加法(基本型)
  13. 【vijos】P1190 繁忙的都市
  14. 【最新】Oracle官网Java SE各个版本JDK下载位置
  15. 均值已知检验方差_21.(6)AB test 假设检验例题实操
  16. 边境的悍匪—机器学习实战:第八章 降维
  17. python发朋友圈突破朋友圈限制_突破限制!原来朋友圈可以发长达5分钟的视频,后悔没早点知道...
  18. Win软件 - 教你正确使用 Win10 专业版系统自带远程桌面(免费内网穿透)
  19. 帝国塔防2 empire defence 2的攻略
  20. go 库 viper 配置解析神器

热门文章

  1. cad展点kszd小程序_CAD展点程序lisp
  2. Tessent专栏第二篇:Tessent Shell ETChecker介绍(1)
  3. 文章痛骂马伊琍是破鞋 盘点不靠谱姐弟恋
  4. 给 IDEA 换个养眼的主题
  5. 电视android怎么连接手机助手,微鲸助手怎么连电视 微鲸助手连接使用说明
  6. 无线lan连接服务器,无线 LAN 控制器和轻量接入点基本配置示例
  7. oracle服务器io,ORACLE数据库服务器IO高的分析方案和案例探讨
  8. 淘宝新手每天要做些什么
  9. 抖音发布五一数据报告:重庆为最热门旅游城市
  10. Arcgis api for JavaScript 4.X 学习——图层加载(要素图层、栅格图层、切片图层)