InnoDB MVCC何时创建read view
来源:互联网 发布:像素人物制作软件 编辑:程序博客网 时间:2024/06/06 12:00
导读
InnoDB MVCC是事务一启动就创建read view,还是什么时候?
几个关于事务的基本概念
说到事务,我们不得不先说下什么是ACID、MVCC、consistent read、read view 等几个基本概念。
ACID
ACID是事务的原子性、一致性、隔离性、持久性4个单词的首字母缩写。所有的事务型数据库系统都遵循这4个特性,InnoDB亦是如此。关于ACID的具体解释请自行 google/bing。
MVCC
是multiversion concurrency control的简称,也就是多版本并发控制,是个很基本的概念。MVCC的作用是让事务在并行发生时,在一定隔离级别前提下,可以保证在某个事务中能实现一致性读,也就是该事务启动时根据某个条件读取到的数据,直到事务结束时,再次执行相同条件,还是读到同一份数据,不会发生变化(不会看到被其他并行事务修改的数据)。
有了 MVCC 就可以提高事务的并行度,因为可以利用锁机制实现资源控制而无需等待其他事务先执行。
read view
InnoDB MVCC使用的内部快照的意思。在不同的隔离级别下,事务启动时(有些情况下,可能是SQL语句开始时)看到的数据快照版本可能也不同。在RR、RC、RU(READ UNCOMMITTED)等几个隔离级别下会用到 read view。
一致性读
读请求基于某个时间点得到一份那时的数据快照,而不管同时其他事务对数据的修改。查询过程中,若其他事务修改了数据,那么就需要从 undo log中获取旧版本的数据。这么做可以有效避免因为需要加锁(来阻止其他事务同时对这些数据的修改)而导致事务并行度下降的问题。
在可重复读(REPEATABLE READ,简称RR)隔离级别下,数据快照版本是在第一个读请求发起时创建的。在读已提交(READ COMMITTED,简称RC)隔离级别下,则是在每次读请求时都会重新创建一份快照。
一致性读是InnoDB在RR和RC下处理SELECT请求的默认模式。由于一致性读不会在它请求的表上加锁,其他事务可以同时修改数据不受影响。
何时创建read view
其实,我们从上面的解释已经明白了,在RC隔离级别下,是每个SELECT都会获取最新的read view;而在RR隔离级别下,则是当事务中的第一个SELECT请求才创建read view。
我们通过几个例子来加强下。
1. RR级别
首先,确认隔离级别
yejr@imysql.com [test]>select @@tx_isolation;+-----------------+| @@tx_isolation |+-----------------+| REPEATABLE-READ |+-----------------+
测试1:事务启动后立即发起SELECT请求
+----+------+---+
| a | b | c |
+----+------+---+
| 10 | 8 | 1 |select * from t1 where a=10;
+----+------+---+
| 10 | 8 | 1 |
事务中第一个SELECT立即创建read viewupdate t1 set c=10 where a=10;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0select * from t1 where a=10;
+----+------+---+
| 10 | 8 | 1 |
再次读取,结果还是一样commit;
提交事务select * from t1 where a=10;
+----+------+---+
| 10 | 8 | 1 |
再次读取,结果仍然一样
结论可见:RR中第一个SELECT已经创建好read view,之后不会再发生变化
测试2:另一个事物提交后才发起SELECT请求
+----+------+---+
| a | b | c |
+----+------+---+
| 10 | 8 | 1 |
update t1 set c=10 where a=10;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
commit;
提交事务select * from t1 where a=10;
+----+------+---+
| 10 | 8 | 10 |
session1提交后才发起SELECT,可以读取到最新版本
结论可见:RR中是发起SELECT时才创建read view,而不是事务刚启动时就创建
2. RC级别
根据上面提到的说法,RC隔离级别下,是每次发起SELECT都会创建read view,也就是每次SELECT都能读取到已经COMMIT的数据,所以才存在不可重复读、幻读 现象。
修改&确认隔离级别
yejr@imysql.com [test]>set session transaction isolation level read committed;yejr@imysql.com [test]>select @@tx_isolation;+-----------------+| @@tx_isolation |+-----------------+| REPEATABLE-READ |+-----------------+
开始测试
+----+------+---+
| a | b | c |
+----+------+---+
| 10 | 8 | 101 |select * from t1 where a=10;
+----+------+---+
| a | b | c |
+----+------+---+
| 10 | 8 | 101 |update t1 set c=102 where a=10;commit;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
Query OK, 0 rows affected (0.02 sec)
select * from t1 where a=10;
+----+------+---+
| 10 | 8 | 102 |
session1提交后再次发起SELECT,可以读取到最新版本begin;update t1 set c=103 where a=10;commit;
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
Query OK, 0 rows affected (0.02 sec)
select * from t1 where a=10;
+----+------+---+
| 10 | 8 | 103 |
再次发起SELECT,又可以读取到最新版本
总结
RR级别下,事务中的第一个SELECT请求才开始创建read view;
RC级别下,事务中每次SELECT请求都会重新创建read view;
延伸阅读
https://dev.mysql.com/doc/refman/5.6/en/innodb-consistent-read.html
https://dev.mysql.com/doc/refman/5.7/en/glossary.html
FAQ系列 | 修改事务隔离级别的暗门
[MySQL FAQ]系列 — 如何查看当前最新事务ID
MVCC原理探究及MySQL源码实现分析
曝!和叶师傅**的正确姿势
知识无界限,不再加原创
喜欢就转走,铁粉加密圈
好铁观音尽在
「老叶茶馆」
http://yejinrong.com
- InnoDB MVCC何时创建read view
- InnoDB MVCC
- mvcc innodb
- mysql innoDB的REPEATABLE READ MVCC事务实现方式
- MySQL InnoDB MVCC原理
- InnoDB MVCC浅谈
- MySQL InnoDB MVCC原理
- innodb mvcc理解
- MySQL InnoDB MVCC深入浅出
- innodb的MVCC功能
- 从InnoDB了解MVCC
- InnoDB MVCC浅谈
- mysql innodb mvcc理解
- mysql Innodb和mvcc
- InnoDB MVCC 要点摘录
- InnoDB的MVCC
- innodb mvcc实现机制
- MVCC实现-MYSQL INNODB MVCC实现
- MySQL巡检怎么做
- InnoDB Buffer Pool巧配置全解
- MySQL 5.7怎么爬出临时表空间的坑
- 老司机带你体验SYS库多种新玩法
- MySQL 8.0.2复制新特性抢鲜看
- InnoDB MVCC何时创建read view
- 网络赚钱方法之游戏试玩赚钱
- java实现打印功能
- qt绘图 QPainter类
- 智力题1
- Stacks
- Uboot 启动过程
- Java components图表描述
- C#静态调用C++Dll导出函数,并在C++Dll中回调C#函数