什么是可重复读

可重复读的实现

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 可重复读 快照_MYSQL可重复读及原理、快照读和当前读相关推荐

  1. mysql可重复读 加锁_mysql可重复读隔离级别加锁分析

    问题 myql可重复读隔离级别下可能会导致插入阻塞,问题复现如下 表中有3列都是int类型 其索引情况如下: id为主索引,c,d为普通索引 现在开始制作问题: 在这里我分别开启两个事务:第一个事务中 ...

  2. mysql 快照_Mysql可重复读(2) —— 快照真的就是快照吗

    上一讲最后抛出了一个问题,Mysql可重复读的"快照"到底是啥? 是对当前数据的全量拷贝吗?每开启一个事务,都要把当前数据库的数据拷贝一份出来? 很明显不是. 一方面,这样做太消耗 ...

  3. mysql可重复读概念_Mysql可重复读原理

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

  4. mysql可重复读实验_Mysql可重复读测试

    mysql的InnoDB索引存储引擎在RR(REPEATABLE READ)隔离级别下读取的情况 测试建表 create table test_transaction ( id bigint(20) ...

  5. mysql全表重命名备份_MySQL数据库重命名的快速且安全方法(3种)

    MySQL数据库重命名的方法 Innodb引擎的表如何改数据库名,MyISAM引擎又该如何操作. 如果表是MyISAM引擎可以直接去到数据库目录mv重命名文件夹就可以. Innodb完全不行,会提示相 ...

  6. mysql重设密码_MySQL之重设密码(忘记密码)讲解

    Windows下的实际操作如下: 1.关闭正在运行的MySQL. 2.打开DOS窗口,转到mysql\bin目录. 3.输入mysqld(或mysqld-nt) --skip-grant-tables ...

  7. mysql 快照读 幻读,InnoDB的MVCC如何解决不可重复读和快照读的幻读,当前读用next-key解决幻读...

    InnoDB默认的隔离级别是RR(可重复读),可以解决脏读和不可重复读,只解决了快照读情况下的幻读问题,当前读情况下解决幻读问题得靠next-key锁. mysql如何实现避免幻读: 在快照读读情况下 ...

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

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

  9. Mysql默认隔离级别为什么是可重复读?

    知识点总结 1.数据库默认隔离级别: mysql -可重复读: oracle,postgres -已提交读 2.mysql binlog的格式三种:statement,row,mixed 3.为什么m ...

最新文章

  1. storyboard和xib的区别
  2. boost::signals2模块实现将参数从信号调用传递到槽的示例程序
  3. 参数位置关于shell
  4. 61二叉搜索树的第k个结点
  5. Java内部类详解(Mark)
  6. SOAP的Could not connect to host in...报错解决方案
  7. Android开源git40个App源码
  8. 使用cookies查询商品详情
  9. 用EasyRecovery恢复手残误删的文件
  10. Altium Designer放置数码管字体
  11. 微信小程序 — 生成二维码功能
  12. 凸优化笔记3(大M法)
  13. 禁用win10触摸屏手势_搞机作战室:win10触控板多指触控,手势操作教程
  14. 瀑布模型快速原型模型
  15. uni-app 实现简单登录注册demo
  16. python中-是什么意思
  17. 原始资料的收集方法———定性资料的收集
  18. Curling 2.0 - POJ 3009
  19. [HTML]解决html5中设置的颜色和浏览器显示的颜色不一致的问题
  20. 编辑器工具--通用编辑器工具(持续完善中)

热门文章

  1. 智能卡技术和身份认证
  2. Infoview表单转换研究(infopath---aspx)
  3. python中enumerate在for循环中用法_python中enumerate的用法实例解析
  4. ylinux系统找到软件_电脑用了段时间发现多处一些软件该怎么办?
  5. mysql 字段可以存数组吗_mysql怎么存数组
  6. kicad绿油开窗_GitHub - OS-Q/S05: KiCad EDA
  7. auve子表单中只读不好用
  8. 计算机论文图,【论文】计算机图像学
  9. 计算机背小学英语吗,小学英语课本点读电脑版
  10. 利用mem数组在MM32 MicroPython中实现COMP的功能