qidao123.com技术社区-IT企服评测·应用市场

标题: MVCC并发版本控制之重点ReadView [打印本页]

作者: 雁过留声    时间: 2023-6-19 20:37
标题: MVCC并发版本控制之重点ReadView
MVCC并发版本控制

本文大部分来自《MySQL是怎样运行的》,这里只是简单总结,用于各位回忆和复习。
版本链

对于使用 InnoDB 存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列(不知道的快去看《MySQL是怎样运行的》)
每次对记录进行改动,都会记录一条undo日志(不懂的可以理解为一个记录着过去的操作的日志) ,每条 undo日志 也都有一个 roll_pointer 属性( INSERT 操作对应的 undo日志 没有该属性,因为该记录并没有更早的版本),可以将这些 undo日志 都连起来,串成一个链表,所以现在的情况就像下图一样:

对该记录每次更新后,都会将旧值放到一条 undo日志 中,就算是该记录的一个旧版本,随着更新次数的增多, 所有的版本都会被 roll_pointer 属性连接成一个链表,我们把这个链表称之为 版本链 ,版本链的头节点就是当 前记录最新的值。另外,每个版本中还包含生成该版本时对应的 事务id ,这个信息很重要,我们稍后就会用到。
ReadView

我们来引出一下readview是什么东西:
对于使用 READ UNCOMMITTED 隔离级别的事务来说,由于可以读到未提交事务修改过的记录,所以直接读取记录的最新版本就好了
对于使用 SERIALIZABLE 隔离级别的事务来说,则是使用加锁的方式来问记录
但是!!!对于使用 READ COMMITTED 和 REPEATABLE READ 隔离级别的事务来说
必须保证读到已经提交了的事务修改过的记录,也就是说假如另一个事务已经修改了记录但是尚未提交, 是不能直接读取最新版本的记录的,核心问题就是:需要判断一下版本链中的哪个版本是当前事务可见的。为此,设计 InnoDB 的大叔提出了一个 ReadView 的概念,这个 ReadView 中主要包含4个比较重要的内容:
有了 ReadView ,这样在访问某条记录时,只需要按照下边4个步骤判断记录的某个版本是否可见:注意,与被访问版本对比的东西都是指(当前最新的ReadView)
ReadView生成时机

读已提交 和 可重复读 隔离级别最大的区别就是它们生成ReadView的时机不同:
具体例子这里不过多赘述,还是自行看书。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4