mysql 可重复读 快照_MYSQL可重复读及原理、快照读和当前读
什么是可重复读
可重复读的实现
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可重复读及原理、快照读和当前读相关推荐
- mysql可重复读 加锁_mysql可重复读隔离级别加锁分析
问题 myql可重复读隔离级别下可能会导致插入阻塞,问题复现如下 表中有3列都是int类型 其索引情况如下: id为主索引,c,d为普通索引 现在开始制作问题: 在这里我分别开启两个事务:第一个事务中 ...
- mysql 快照_Mysql可重复读(2) —— 快照真的就是快照吗
上一讲最后抛出了一个问题,Mysql可重复读的"快照"到底是啥? 是对当前数据的全量拷贝吗?每开启一个事务,都要把当前数据库的数据拷贝一份出来? 很明显不是. 一方面,这样做太消耗 ...
- mysql可重复读概念_Mysql可重复读原理
概念 可重复读的实现 Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录(读已经提交的,其实是读早于本事务开始且已经提交的),但是不能看到其他事务对 ...
- mysql可重复读实验_Mysql可重复读测试
mysql的InnoDB索引存储引擎在RR(REPEATABLE READ)隔离级别下读取的情况 测试建表 create table test_transaction ( id bigint(20) ...
- mysql全表重命名备份_MySQL数据库重命名的快速且安全方法(3种)
MySQL数据库重命名的方法 Innodb引擎的表如何改数据库名,MyISAM引擎又该如何操作. 如果表是MyISAM引擎可以直接去到数据库目录mv重命名文件夹就可以. Innodb完全不行,会提示相 ...
- mysql重设密码_MySQL之重设密码(忘记密码)讲解
Windows下的实际操作如下: 1.关闭正在运行的MySQL. 2.打开DOS窗口,转到mysql\bin目录. 3.输入mysqld(或mysqld-nt) --skip-grant-tables ...
- mysql 快照读 幻读,InnoDB的MVCC如何解决不可重复读和快照读的幻读,当前读用next-key解决幻读...
InnoDB默认的隔离级别是RR(可重复读),可以解决脏读和不可重复读,只解决了快照读情况下的幻读问题,当前读情况下解决幻读问题得靠next-key锁. mysql如何实现避免幻读: 在快照读读情况下 ...
- MySQL面试三连杀:如何实现可重复读、又为什么会出现幻读、是否解决了幻读问题?...
作者 | sanyuesan0000 来源 | https://blog.csdn.net/sanyuesan0000 事务隔离级别有四种,mysql默认使用的是可重复读,mysql是怎么实现可重复读 ...
- Mysql默认隔离级别为什么是可重复读?
知识点总结 1.数据库默认隔离级别: mysql -可重复读: oracle,postgres -已提交读 2.mysql binlog的格式三种:statement,row,mixed 3.为什么m ...
最新文章
- storyboard和xib的区别
- boost::signals2模块实现将参数从信号调用传递到槽的示例程序
- 参数位置关于shell
- 61二叉搜索树的第k个结点
- Java内部类详解(Mark)
- SOAP的Could not connect to host in...报错解决方案
- Android开源git40个App源码
- 使用cookies查询商品详情
- 用EasyRecovery恢复手残误删的文件
- Altium Designer放置数码管字体
- 微信小程序 — 生成二维码功能
- 凸优化笔记3(大M法)
- 禁用win10触摸屏手势_搞机作战室:win10触控板多指触控,手势操作教程
- 瀑布模型快速原型模型
- uni-app 实现简单登录注册demo
- python中-是什么意思
- 原始资料的收集方法———定性资料的收集
- Curling 2.0 - POJ 3009
- [HTML]解决html5中设置的颜色和浏览器显示的颜色不一致的问题
- 编辑器工具--通用编辑器工具(持续完善中)
热门文章
- 智能卡技术和身份认证
- Infoview表单转换研究(infopath---aspx)
- python中enumerate在for循环中用法_python中enumerate的用法实例解析
- ylinux系统找到软件_电脑用了段时间发现多处一些软件该怎么办?
- mysql 字段可以存数组吗_mysql怎么存数组
- kicad绿油开窗_GitHub - OS-Q/S05: KiCad EDA
- auve子表单中只读不好用
- 计算机论文图,【论文】计算机图像学
- 计算机背小学英语吗,小学英语课本点读电脑版
- 利用mem数组在MM32 MicroPython中实现COMP的功能