• MVCC实现过程


    什么是MVCC

    MVCC,多版本并发控制。

    通过保存数据的历史版本,根据比较数据的版本号来决定数据的是否显示,在不需要加读锁的情况就能达到事务的隔离效果,最终可以在读取数据的时候可以同时进行修改,修改数据时候可以同时读取,极大的提升了事务的并发性能。

    部分名词解释

    名词解释
    事务版本号一个事务开启后都会获得一个自增长的事务的ID,由此判断先后顺序
    trx_id记录操作该数据事务的事务ID
    roll_pointer相当于一个指针,指向回滚段的undo日志
    row_id单调递增的行ID,不是必需的,占用6个字节
    undo log回滚日志,用于记录数据被修改前的信息
    版本链多个事务并行操作某一行数据时,不同事务对该行数据的修改会产生多个版本,然后通过回滚指针,连成一个链表
    快照读读取的是记录数据的可见(有旧版本)版本(不加锁)
    当前读读取的是记录数据的最新版本(显式加锁)
    Read View执行SQL语句时产生的读视图,判断当前事务可见哪个版本的数据
    m_ids当前系统活跃未提交的所有事务ID(列表)
    up_limit_id生成Read View时,当前系统中活跃的读写事务中最小的事务id
    low_limit_id生成Read View时,系统中应该分配给下一个事务的id值
    creator_trx_id创建当前Read View的事务ID

    MVCC实现流程

    在这里插入图片描述

    说明一下Read View的匹配规则。

    1)如果数据事务ID trx_id < up_limit_id,表明生成该版本的事务在生成Read View前,已经提交(因为事务ID是递增的),所以该版本可以被当前事务访问。

    2)如果trx_id >= low_limit_id,表明生成该版本的事务在生成ReadView后才生成,所以该版本不可以被当前事务访问。

    3)如果 up_limit_id <= trx_id < low_limit_id,需要分3种情况讨论

    (1)如果m_ids包含trx_id,则代表Read View生成时刻,这个事务还未提交,但是如果数据的trx_id等于creator_trx_id的话,表明数据是自己生成的,因此是可见的。
    (2)如果m_ids包含trx_id,并且trx_id不等于creator_trx_id,则Read View生成时,事务未提交,并且不是自己生产的,所以当前事务也是看不见的;
    (3)如果m_ids不包含trx_id,则说明你这个事务在Read View生成之前就已经提交了,修改的结果,当前事务是能看见的。
    
    • 1
    • 2
    • 3
  • 相关阅读:
    Linux——文件传输协议知识点梳理
    【LeetCode热题100】【多维动态规划】编辑距离
    element-plus ElMessageBox 实现复制功能,动态点击html元素不生效解决
    CS231n课程笔记:Leture5 Convolutional Neural Networks
    学习笔记-.net安全越权
    前几年外包干了四年,秋招感觉人生就这样了..
    一文搞定注意力机制(Attention)
    JavaSE基础(重要知识点)
    ubuntu 22.04 截图工具 shutter
    使用kotlin用回溯法解决电话号码的字母组合问题
  • 原文地址:https://blog.csdn.net/oldboy1999/article/details/126117680