什么是可重复读

可重复读的实现
Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录(读已经提交的,其实是读早于本事务开始且已经提交的),但是不能看到其他事务对已有记录的更新(即晚于本事务开始的),并且,该事务不要求与其他事务是“可串行化”的。




可以看到当session2 在步骤4插入新纪录并提交时,session1查到的还是之前的数据,而要想查现在的数据,可以在后面加一个共享锁即 lock in share mode;

可重复读实现原理

事务ID是递增的。
使用MVCC(多版本并发控制)。InnoDB为每行记录添加了一个事务ID,每当修改数据时,将当事务ID写入。
在读取事务开始时,系统会给事务一个当前版本号(事务ID),事务会读取版本号<=当前版本号的数据,这时就算另一个事务插入一个数据,并立马提交,新插入这条数据的版本号会比读取事务的版本号高,因此读取事务读的数据还是不会变。

MVCC:Snapshot Read vs Current Read

MySQL InnoDB存储引擎,实现的是基于多版本的并发控制协议——MVCC (Multi-Version Concurrency Control) (注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)。MVCC最大的好处,相信也是耳熟能详:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能,这也是为什么现阶段,几乎所有的RDBMS,都支持了MVCC。

在MVCC并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read)。快照读,读取的是记录的可见版本 (有可能是历史版本),不用加锁。当前读,读取的是记录的最新版本,并且,当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录。

在一个支持MVCC并发控制的系统中,哪些读操作是快照读?哪些操作又是当前读呢?以MySQL InnoDB为例:
快照读:简单的select操作,属于快照读,不加锁。(当然,也有例外,下面会分析)
select * from table where ?;
当前读:特殊的读操作,插入/更新/删除操作,属于当前读,需要加锁。
select * from table where ? lock in share mode;
select * from table where ? for update;
insert into table values (…);
update table set ? where ?;
delete from table where ?;
所有以上的语句,都属于当前读,读取记录的最新版本。并且,读取之后,还需要保证其他并发事务不能修改当前记录,对读取记录加锁。其中,除了第一条语句,对读取记录加S锁 (共享锁)外,其他的操作,都加的是X锁 (排它锁)。

什么是幻读

事务2执行后,在事务1中查询没有查到2添加的数据行,这就是可重复读。
但是,在事务1执行了update后,再查询时就查到了事务2中添加的数据,这就是幻读。
这种结果告诉我们其实在MySQL可重复读的隔离级别中并不是完全解决了幻读的问题,而是解决了读数据情况下的幻读问题。而对于修改的操作依旧存在幻读问题,就是说MVCC对于幻读的解决是不彻底的。

关于锁的知识

请参考大神之作https://www.cnblogs.com/zhoujinyi/p/3435982.html

MYSQL可重复读及原理、快照读和当前读相关推荐

  1. MySQL可重复读隔离级别为何没有解决幻读(MVCC原理简介)

    MySQL可重复读隔离级别为何没有解决幻读(MVCC原理简介) 一.MCVV简介 二.可重复读隔离级别能解决幻读? 三.什么是当前读和快照读? 四.MVCC的实现原理 五.RC,RR级别下的InnoD ...

  2. Mysql可重复读隔离级别下如何解决幻读

    Mysql可重复读隔离级别下如何解决幻读 一些概念 具体加锁说明 使用主键索引进行等值查询 使用主键索引进行范围查询 使用二级索引进行等值查询 使用二级索引进行范围查询 一些概念 幻读:在一次事务中, ...

  3. MySQL可重复读级别会不会造成幻读

    一.定义 在<高性能MySQL>一书中,是这样描述的 根据书上的描述,MySQL的可重复读隔离级别通过MVCC机制,解决了幻读的问题,所以不会造成幻读 二.测试 本文默认你已经知道以下的命 ...

  4. Mysql可重复读实现原理分析

    InnoDB 里面每个事务有一个唯一的事务 ID,叫作 transaction id.它是在事务开始的时候向 InnoDB 的事务系统申请的,是按申请顺序严格递增的. 一个事务只需要在启动的时候,找到 ...

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

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

  6. mysql 可重复读 快照_MYSQL可重复读及原理、快照读和当前读

    什么是可重复读 可重复读的实现 Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录(读已经提交的,其实是读早于本事务开始且已经提交的),但是不能看到 ...

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

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

  8. mysql可重复读_到底什么是mysql的幻读和不可重复读

    幻读和不可重复读的定义 事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据称为幻读. 如果事务A 按一定条件搜索, ...

  9. MySQL可重复读级别能够解决幻读吗

    引言 之前在深入了解数据库理论的时候,了解到事物的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了.但是对于幻 ...

  10. mysql可重复读的实现原理

    MySQL可重复读的实现原理 1.原理 MySQL默认的隔离级别是可重复读,即:事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容. 那么MySQ ...

最新文章

  1. AI算法领域常用的39个术语(下)
  2. java下实现调用oracle的存储过程和函数
  3. linux编程-open函数和write函数实现copy命令
  4. STL常用的排序算法
  5. 将用int型存储的时间转换成time时间格式笔记
  6. HTTP强制设置状态码
  7. java web 通过servlet访问web_inf jsp跳转_WEB-INF下的jsp通过servlet中超链接跳转
  8. 队列的JS实现及广度优先搜索(BFS)的实现
  9. 软件工程实验报告:图书管理系统
  10. AMD RX580刷BIOS提高ETH算力
  11. 宇视存储服务器vs系列,宇视产品系列之存储产品篇1.pptx
  12. AppSpider:Xposed+JustTrustMe关闭SSL证书验证
  13. 【三极管知识】之【9011,9012,9013,9014,8050,8550 三极管的区别】
  14. 酷派手机锁屏壁纸提取
  15. 京东云服务器——免费体验6个月
  16. Vivado 添加IOB方法
  17. 一个苏州IT人的5年挨踢经历-------面试,薪资,企业,经历全方位揭示(之二)
  18. 《痞子衡嵌入式半月刊》 第 55 期
  19. SPACESNIFFER查看文件大小
  20. 阿里云ACP级认证考试心得+过关经验 1

热门文章

  1. 如何用C语言编程序化交易,程序化交易的开发步骤
  2. python_计算股票指标
  3. Python制作Windows系统服务
  4. hdu1052 Tian Ji -- The Horse Racing
  5. 云点域名-(域名解析、域名转向、二级域名、动态域名)的功能介绍
  6. Tomcat之Directory Listing
  7. 仓库温度湿度控制措施_一般仓库的温湿度控制范围是多少合适?
  8. 自然语言处理之词移距离Word Mover's Distance
  9. FFFfrance博客介绍
  10. HIVE 系列 (4) hive 内部表和外部表HQL查询统计