一、快照读和当前读(参考这篇文章)

在RR级别中,通过MVCC机制,虽然让数据变得可重复读,但我们读到的数据可能是历史数据,不是数据库最新的数据。这种读取历史数据的方式,我们叫它快照读 (snapshot read),而读取数据库最新版本数据的方式,叫当前读 (current read),这两者是冲突的。

1.快照读
当执行select操作时,Innodb默认执行快照读,会记录下这次select后的结果,之后select 的时候就会返回这次快照的数据,即使其他事务提交了不会影响当前select的数据,这就实现了可重复读了(InnoDB默认隔离级别是可重复读,和这个说法一致)。快照的生成时机是在第一次执行select的时候,也就是说假设当A开启了事务,然后没有执行任何操作,这时候B insert了一条数据然后commit,这时候A执行 select,读到的数据中就会有B添加的那条数据。之后无论再有其他事务commit都没有关系,因为快照已经生成了,后面的select都是根据快照来的。

先提一句:快照读是通过MVCC和undo log实现的,暂不展开

2.当前读
对于会修改数据的操作(update、insert、delete)都是采用当前读的模式,通过加锁来保证增删改的数据无法通过其他事务访问。在执行这几个操作时会读取最新的记录,即使是别的事务提交的数据也可以查询到。假设要update一条记录,但是在另一个事务中已经delete掉这条数据并且commit了,如果update就会产生冲突,所以在update的时候需要知道最新的数据(例子可参考这篇文章的“试验一”)

那么如何使用select操作实现当前读呢?答案是需要手动加锁(例子可参考这篇文章的“试验四”)

select * from table where ? lock in share mode;
select * from table where ? for update;

二、select for update 和 select lock in share mode

select…lock in share在select的结果集上加一个共享锁.允许其他会话读取这些数据,但不允许修改.
select…for update 将读取的结果集加一个排他锁. 阻止其他会话读或写该结果集.
而这里加的锁是next-key lock

三、当前读时如何避免幻读
当前读是通过next-key lock实现,next-key lock会锁住一个范围,并且锁定记录本身,使得其他事务不能操作锁定范围内的记录,也就杜绝了出现“幻影”。(因为其他事务根本无法在此范围里插入数据)

四、快照读时如何避免幻读
呵呵,快照读时没有避免幻读,只是在select时都是读到历史数据,看起来是没有幻读,但是当你更新时,发现,明明没有这条数据呀?!(例子可参考这篇文章中的“试验一”和“试验二”)

五、结论
在InnoDB的RR隔离级别下
1.对于快照读,通过MVCC实现了重复读,但是没有完全避免幻读,只是在简单select时避免了幻读
2.要完全避免幻读,需要手动加锁进行当前读,这时会使用next-key lock避免幻读

InnoDB的RR隔离级别能否防止“幻读”相关推荐

  1. InnoDB在RR隔离级别下解决幻读问题

    表象:快照读(非阻塞读)-伪MVCC 内在:next-key锁(行锁+gap锁) 当前读和快照读 当前读:select-lock in share mode(共享锁),select-for updat ...

  2. 事务的四大隔离级别中的幻读问题

    1. 什么是幻读? 大部分学习过数据库的人应该都了解幻读这个概念,我在这里帮大家复习下.以下都是以InnoDB存储引擎为例进行说明.数据库并发访问中,针对delete和insert操作可能出现幻读这种 ...

  3. 数据库事务隔离级别-- 脏读、幻读、不可重复读(清晰解释)

    一.数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这四 ...

  4. 数据库零碎要点001_数据库的4大特性(原子性_持久性_隔离性_一致性)_数据库的隔离级别(脏读_幻读_不可重复读)_mysql如何设置隔离级别

    本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务 ...

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

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

  6. 数据库事务隔离级别-- 脏读、幻读、不可重复读

    一.数据库事务的隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable,这四 ...

  7. MySQL RR隔离级别解决幻读问题?

    首先,讲mysql的隔离级别之前需要复习一下事务的四个特性 (注:mysql存储引擎InnoDB)(待完善) 事务的四个特性(ACID): 原子性(Atomicity) 一致性(Consistency ...

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

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

  9. mysql 幻读的隔离_MySQL的RR隔离级别与幻读问题

    最近在网上看了不少mysql锁的文章,不少文章都提到InnoDB的RR隔离级别(Repeatable Read)无法解决幻读的问题.对此问题作者亲自做了一些实验,将实验结论记录在此. 本次实验的mys ...

  10. mysql 默认事务隔离级别_一文读懂MySQL的事务隔离级别及MVCC机制

    回顾前文: <一文学会MySQL的explain工具> <一文读懂MySQL的索引结构及查询优化> (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论 ...

最新文章

  1. pytorch学习笔记(九):PyTorch结构介绍
  2. java 数组集合转换_Java 实例 – 集合转数组
  3. 用python连接redis时错误InvalidResponse: Protocol Erro...
  4. 2.2 逻辑回归-机器学习笔记-斯坦福吴恩达教授
  5. IIS Form 认证 保护HTML页面
  6. hMailServer C#API
  7. 基于 FFmpeg 的播放器 demo
  8. FreeSql (十七)联表查询
  9. 程序路径查找 找到指定程序所在的目录
  10. nim3取石子游戏 (威佐夫博弈)
  11. UML建模工具 Visual Paradigm敏捷开发教程(一):如何确立项目愿景
  12. Linux系统进程优化理论与方法
  13. 33 - Guarded Suspension模式 等待唤醒机制的规范
  14. 软件开发团队必备管理工具
  15. SSH登陆,用XShell
  16. Modeling in Blender: Low Poly Car
  17. Linux hash表
  18. 程序员成长的四个简单技巧,你 get 了吗?
  19. 中国海洋大学计算机科学与技术考研分数线,中国海洋大学研究生院2020录取分数线...
  20. 地理坐标系、大地坐标系、地图投影与重投影

热门文章

  1. Java基础知识2(字符串)
  2. PagerAdapter跟BaseAdapter的覆盖
  3. SQL Server里的闩锁介绍
  4. sqlserver2005身份验证
  5. Oracle10g安装在RHEL AS 3
  6. 可实现的python拟牛顿法的DFP算法
  7. mysql存表情出错的解决方案(类似\xF0\x9F\x98\x86\xF0\x9F)
  8. Android 获取当前日期算前一年、前一月、前一天Calendar
  9. weblogic 找不到数据源问题
  10. C# 开发 OPC Server 系列之二