周一的时候被问到了幻读的问题,之前都是看别人写的文章没有建套环境来实际操作一下。

其实很多问题不仅是要看源码,还是需要动动手,光看还是会忘记。

先说结论在忽略参数设置的情况下, MySQL 的确使用 MVCC 配合 Gap Lock 解决了 RR 隔离级别下的当前读(用 Gap Lock)和快照读(用 MVCC)的幻读问题。

我们先来建立测试用的基础表

CREATE TABLE `t` (

`id` int(11) NOT NULL,

`c` int(11) DEFAULT NULL,

`d` int(11) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `c` (`c`)

) ENGINE=InnoDB;

insert into t values(0,0,0),(5,5,5),

(10,10,10),(15,15,15),(20,20,20),(25,25,25);

MVCC 快照读解决幻读

然后 先来看看在 RR 级别下因为 MVCC 的关系解决幻读的情况

session1

session2

session3

line 1

begin;

select * from t where d =5;

line 2

update t set d = 5 where id = 0

line 3

select * from t where d =5;

line 4

insert into t value(1, 1, 5)

line 5

select * from t where d =5;

line 6

commit;

line 1 session 1

mysql>begin;

Query OK, 0 rows affected (0.00sec)

mysql> select * from t where d = 5;+----+------+------+

| id | c | d |

+----+------+------+

| 5 | 5 | 5 |

+----+------+------+

1 row in set (0.00 sec)

line 2 session 2 执行后 line 3 session 1

mysql> update t set d = 5 where id =0;

Query OK,1 row affected (0.00sec)

Rows matched:1 Changed: 1Warnings: 0

mysql> select * from t where d = 5;+----+------+------+

| id | c | d |

+----+------+------+

| 5 | 5 | 5 |

+----+------+------+

1 row in set (0.00 sec)

line 4 session3 执行后的 line 5 session 1

mysql> insert into t value (1, 1, 5);

Query OK,1 row affected (0.01sec)

mysql> select * from t where d = 5;+----+------+------+

| id | c | d |

+----+------+------+

| 5 | 5 | 5 |

+----+------+------+

1 row in set (0.00 sec)

可以看到在快照读的情况下, RR 隔离级别可以通过 MVCC 保护自己事务内的数据,无论外面如何修改。

Gap Lock 解决当前读下的幻读

当前读的情况下我们就无法达到刚才的效果了,还是刚才那个流程

session1

session2

session3

line 1

begin;

select * from t where d =5 for update;

line 2

update t set d = 5 where id = 0

line 3

select * from t where d =5 for update;

line 4

insert into t value(1, 1, 5)

line 5

select * from t where d =5 for update;

line 6

commit;

我为 session 1里的所有查询都加上当前读的 for update 。会发现从 session2 开始就被阻塞了。

这里就是在执行 select * from t where d = 5 for update 的时候因为 d 上没有索引的关系,MySQL 直接将该字段的全部范围都打上了 Gap Lock,所以无法执行插入更新操作,就阻塞住了。

可以看到通过 Gap Lock 我们即使在当前读也被阻止了幻读,因为 Gap Lock 的关系 session c 尝试往里插入新数据也同样被阻塞从而保证了数据的一致性。

所以回到文中开始的那个问题,MySQL 在 RR 事务隔离级别下,的确通过 MVCC 以及 Gap Lock 解决了幻读问题,是我答错了。

原文:https://www.cnblogs.com/piperck/p/13042303.html

mysql mvcc gap lock_为什么说 MVCC 和 Gap Lock 解决了 MySQL 的幻读问题相关推荐

  1. MySQL面试三连杀:如何实现可重复读、又为什么会出现幻读、是否解决了幻读问题?...

    作者 | sanyuesan0000 来源 | https://blog.csdn.net/sanyuesan0000 事务隔离级别有四种,mysql默认使用的是可重复读,mysql是怎么实现可重复读 ...

  2. MySQL学习笔记(九)MVCC

    什么是MVCC MVCC,全称Multi-Version Concurrency Control,即多版本并发控制.MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程 ...

  3. mysql 中的脏读与幻读_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...

    首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...

  4. mysql 可重复读 悲观锁_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...

    首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...

  5. mysql可重复读和幻读的理解

    mysql可重复读和幻读的理解 可重复读和幻读的定义 最后总结 参考资料 很多教程和书籍对mysql的可重复读和幻读的解释都比较含糊,本文结合原理和其他的考证,深入分析下. 这里讨论的引擎是常用的In ...

  6. mysql悲观锁会有脏数据吗_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...

    首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...

  7. MySQL可重复读隔离级别能解决幻读吗?

    事务及事务隔离级别 innodb存储引擎支持事务,myisam不支持事务 事务内的操作要么全部成功,要么全部失败,中途有失败则回滚 事务的ACID:原子性,一致性,隔离性,持久性 事务隔离级别需要解决 ...

  8. 【十四】MySQL Innodb RR隔离级别下到底是不是解决了幻读

    我之前一直质疑网传mysql innodb的RR隔离级别下,next-key lock解决了幻读这种说法的准确性. 这次理顺了. 例子准备: 场景一.select * from user order ...

  9. 解决安装mysql的”A Windows service with the name MySQL already exists.“问题

    解决安装mysql的"A Windows service with the name MySQL already exists."问题 参考文章: (1)解决安装mysql的&qu ...

最新文章

  1. php 字符串内容过滤,php过滤字符串内容的
  2. fastDFS分布式文件系统--文件上传/下载/查询完整代码实现
  3. 万能门店小程序_关于传统门店开发微信小程序的优势
  4. Maximum Subsequence Value CodeForces - 1365E(规律+暴力)
  5. 安装rpm报错:requires Ruby version >= 2.*.*
  6. android的动画实例
  7. win10下Redis集群搭建的详细步骤
  8. Shell脚本基本用法
  9. POJ 2117 Electricity 割点 Tarjan算法
  10. 相机标定(四)—— 仿射变换和透视变换
  11. gdb在cygwin下的安装
  12. 21-nginx单机1W并发优化
  13. 粒子群算法求解二元函数极值-附带800字程序说明
  14. 颜色格式转换: 最简单的基于FFmpeg的libswscale的示例(YUV转RGB)
  15. 未实施内容安全策略 (CSP)
  16. QQ空间自动点赞脚本
  17. 如何将ida中的悬浮窗口恢复原位
  18. (学习笔记)OrCAD进行DRC时报错以及解决办法
  19. 五招教你做好企业年终绩效考核,太实用了!
  20. [Scene Graph] Neural Motifs: Scene Graph Parsing with Global Context 论文解读

热门文章

  1. 酷狗笔试题:补齐左括号(栈)
  2. MFC中如何将焦点设置到指定控件上
  3. 数据结构与算法 —— 链表linked list(05)
  4. mongodb在windows下安装启动
  5. 【题解】SDOI2014数数
  6. views.py视图函
  7. 关于focus的概念
  8. CSS word-wrap强制换行截断长字符串
  9. ie6/ie7/firefox/dispaly:inline-block:兼容性
  10. 升级npm之后,保存的位置仍然在C盘,不在自己规定的盘下