mysql|MySQL数据库的核心MVCC详解( 三 )


??什么是 Read View,说白了 Read View 就是事务进行快照读操作的时候生产的读视图 (Read View),在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的 ID (当每个事务开启时,都会被分配一个 ID , 这个 ID 是递增的,所以最新的事务,ID 值越大)
??所以我们知道 Read View 主要是用来做可见性判断的, 即当我们某个事务执行快照读的时候,对该记录创建一个 Read View 读视图,把它比作条件用来判断当前事务能够看到哪个版本的数据,既可能是当前最新的数据,也有可能是该行记录的undo log里面的某个版本的数据。
??Read View遵循一个可见性算法,主要是将要被修改的数据的最新记录中的 DB_TRX_ID(即当前事务 ID )取出来,与系统当前其他活跃事务的 ID 去对比(由 Read View 维护),如果 DB_TRX_ID 跟 Read View 的属性做了某些比较,不符合可见性,那就通过 DB_ROLL_PTR 回滚指针去取出 Undo Log 中的 DB_TRX_ID 再比较,即遍历链表的 DB_TRX_ID(从链首到链尾,即从最近的一次修改查起),直到找到满足特定条件的 DB_TRX_ID , 那么这个 DB_TRX_ID 所在的旧记录就是当前事务能看见的最新老版本.

mysql|MySQL数据库的核心MVCC详解
文章插图
在这里插入图片描述
举例说明:

mysql|MySQL数据库的核心MVCC详解
文章插图
在这里插入图片描述
分析:

mysql|MySQL数据库的核心MVCC详解
文章插图
在这里插入图片描述
第二种情况:


mysql|MySQL数据库的核心MVCC详解
文章插图
在这里插入图片描述
分析:

mysql|MySQL数据库的核心MVCC详解
文章插图
在这里插入图片描述
最后完成的绘图:


mysql|MySQL数据库的核心MVCC详解
文章插图
在这里插入图片描述
扩展阅读:https://www.ixiera.com
【 mysql|MySQL数据库的核心MVCC详解】总结:能否看到事务修改的数据,取决于可见性算法,可见性算法比较的时候又取决于ReadView中的结果值!因为在不同隔离级别的时候,生成ReadView的时机是不同的RC:每次执行时快照读都会重新生成新的ReadViewRR:只有当第一次事务进行快照读的时候才会生成ReadView,之后的快照读操作都会复用当前的ReadView 。

推荐阅读