快照读?版本链?什么是readView?MVCC如何实现事务的隔离性?"/>
【Mysql篇】什么是MVCC?什么是快照读?版本链?什么是readView?MVCC如何实现事务的隔离性?
目录
- 什么是MVCC(多版本并发控制)
- 题外话:当前读和快照读
- 1. 当前读(行锁 + 间隙锁)
- 2. 快照读(mvcc + undolog)
- 1. 定义(Mutli Version Concurreny Control)
- 2. MVCC的组成要素
- 1. 每条记录有三个隐藏列
- 1. 事务ID(trx_id)
- 2. 回滚指针(roll_pointer)
- 3. 隐藏主键(row_id)
- 2. undolog日志
- 1. 分类
- 1. insert undo_log(insert操作,给自己事务看的)
- 2. update undo_log(update、delete操作)
- 3. 版本链
- 3. readView(读视图)
- 1. 组成
- 1. m_ids(存活的事务id列表)
- 2. min_trx_id(m_ids中的最小事务id)
- 3. max_trx_id(新的事务id值)
- 4. creator_trx_id(生成这个readView的事务id)
- 2. 有什么作用
- 3. readView是如何判断版本链中的那个版本可用的
- 1.什么时候生成Read-View?
- 3. MVCC实现原理
- 5. MVCC主要有什么作用
- 1. 非阻塞的并发读写
- 2. 实现读已提交和可重复读
- 1. 问:MVCC如何实现RC(以select为单位的)
- 2. 问:MVCC如何实现RR(以事务为单位的)
什么是MVCC(多版本并发控制)
关键字:快照读、事务的隔离性(ACID)、trx_id、roll_pointer、undolog、版本链、readView、判断逻辑、判断顺序
题外话:当前读和快照读
1. 当前读(行锁 + 间隙锁)
就是读取当前数据的最新记录,会加锁,为了保证其他事务不能修改记录(如select lock in share mode(共享锁), select for update ; update, insert ,delete(排他锁))
当前读由行锁+间隙锁实现
2. 快照读(mvcc + undolog)
不加锁的select操作就是快照读(隔离级别不能是串行化,如果是串行化快照读就变成了当前读)
快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本
图片链接:=333.337.search-card.all.click
1. 定义(Mutli Version Concurreny Control)
参考链接:mysql MVCC+间隙锁解决幻读理解
MVCC其实就是一个多版本并发控制,即多个不同版本的数据实现并发控制的技术,其基本思想是为每次事务生成一个新版本的数据,在读数据时选择不同版本的数据即可以实现对事务结果的完整性读取。
2. MVCC的组成要素
1. 每条记录有三个隐藏列
1. 事务ID(trx_id)
记录创建这条记录/最后一次修改该记录的事务ID
2. 回滚指针(roll_pointer)
指向undolog日志的上一个版本
3. 隐藏主键(row_id)
隐含的自增ID。现在不知道干嘛用的
2. undolog日志
每次update操作都会生成一条undo_log日志,分为insert undo log和update undo log
1. 分类
1. insert undo_log(insert操作,给自己事务看的)
如insert操作,只针对当前事务,在insert操作后产生undo_log记录,在事务提交后删除undo_log记录,说白了就是给当前事务自己看的.
2. update undo_log(update、delete操作)
update 和 delete操作,会根据隔离级别不同事务版本的数据可见性不同
注意:update操作生成undolog日志,select操作生成readView读视图对象!两个生成时机要区分开
3. 版本链
通过回滚指针将undolog日志连接起来,形成的就叫做版本链
3. readView(读视图)
1. 组成
1. m_ids(存活的事务id列表)
表示生成readView时,当前系统中活跃的读写事务的事务id列表
白话文:存活、活跃,指的就是未commit
2. min_trx_id(m_ids中的最小事务id)
表示生成readView时,当前系统中活跃的读写事务中最小的事务id
3. max_trx_id(新的事务id值)
表示生readView时,系统中应该分配给下一个事务的id值
4. creator_trx_id(生成这个readView的事务id)
表示生成这个readView的事务id
2. 有什么作用
让我知道 我在这个版本链中选择哪一条undolog记录
3. readView是如何判断版本链中的那个版本可用的
每一个undolog有自己的事务id,叫做trx_id
图片链接:=333.337.search-card.all.click
1.什么时候生成Read-View?
要看数据库的隔离级别:
- 可重复读:返回的是第一次查询生成的【read-view】
- 读已提交每次select时都会重新生成一个新的【read-view】
3. MVCC实现原理
查询的时候会读取出【read-view】,并根据read-view从undo_log日志中最新的记录依次往下找
有点晦涩难懂:具体的操作看这篇文章,写的非常棒!
.html
5. MVCC主要有什么作用
1. 非阻塞的并发读写
提高并发读写性能,操作时会生成事务id,能够更好地解决读-写冲突,不加锁、非阻塞的并发读
2. 实现读已提交和可重复读
MVCC只能实现读已提交和可重复读;如果是读未提交,那么每次查询都能获取最新的修改值。
1. 问:MVCC如何实现RC(以select为单位的)
读已提交生成readView是以select为单位的,每次select时都会重新生成一个新的【read-view】,然后去【undo】日志中寻找符合结果的一条数据,
2. 问:MVCC如何实现RR(以事务为单位的)
可重复读生成readView是以事务为单位的,第一次查询的时候生成一个新的【read-view】,后面的查询会继续沿用第一次的【read-view】,然后找出一个可读的数据
更多推荐
【Mysql篇】什么是MVCC?什么是快照读?版本链?什么是readView?MVCC如何实现事务的隔离性?
发布评论