• MVCC:多版本并发控制案例分析(一)


    (笔记总结自b站马士兵教育课程)

    一、简介

    MVCC:全称multi-version Concurency control,多版本并发控制,是为了解决并发读写问题存在的。MVCC的实现原理由三部分组成:隐藏字段、undolog、readview。

    二、概念补充

    当前读:读取的总是最新的数据,例如update、insert、delete等等。

    快照读:读取的是历史的数据,例如select

    数据库并发场景:

    ①读读:不会产生任何问题,也不需要进行并发控制。

    ②读写:会存在数据安全问题,比如脏读、幻读、不可重复读,可以通过加锁的方式来解决,但是会存在性能安全问题。

    ③写写:会存在数据安全问题,比如更新丢失问题。

    三、隐藏字段和undolog

    mysql所对应的行记录除了我们自定义的字段之外,mysql会默认的添加一些隐藏字段,对于用户是不可见的。

    DB_TRX_ID创建这条记录或者最后一次修改该记录的事务id
    DB_ROLL_PTR回滚指针,指向这条记录的上一个历史版本
    DB_ROW_ID隐藏主键,当表创建的时候没有设置主键,那么会生成一个6字节的rowid

    (事务id:mysqlserver自动赋值,并且是递增的)

    事务1新增一条记录:

    nameageDB_TRX_IDDB_ROLL_PTRDB_ROW_ID
    ABC101NULL1

    undolog:回滚日志,表示在进行insert、delete、update操作的时候产生的方便回滚的事务。

    事务2修改name=DEF:

    nameageDB_TRX_IDDB_ROLL_PTRDB_ROW_ID
    DEF1020x1231

    此时undolog代码块:

     

    nameageDB_TRX_IDDB_ROLL_PTRDB_ROW_ID
    ABC101NULL1

    事务2中的DB_ROLL_PTR 中的地址记录的是事务1版本的数据在undolog的数据。

    事务3修改age=12:

    nameageDB_TRX_IDDB_ROLL_PTRDB_ROW_ID
    DEF1230x4561

    此时undolog代码块:

     

    nameageDB_TRX_IDDB_ROLL_PTRDB_ROW_ID
    DEF1020x1231
                    
    nameageDB_TRX_IDDB_ROLL_PTRDB_ROW_ID
    ABC101NULL1

    事务3中的DB_ROLL_PTR 中的地址记录的是事务2版本的数据在undolog的数据,事务2中的DB_ROLL_PTR 中的地址记录的是事务1版本的数据在undolog的数据。

    我们发现undolog最终会变成一个链表,链首表示的是最新的旧纪录,链尾表示的是最旧的旧纪录,undolog链表不会无限增加,后台有一个purge的线程来对undolog进行维护,当不需要的时候就会进行删除,在undolog删除的时候会分为两类,insert对应一类undolog,只要事务提交就可以删除,update、delete对应一类undolog,除了事务提交之后,还要保证mvcc不用才会删除。

  • 相关阅读:
    计算机毕业设计springboot基于springboot的游戏交易网络无忧3op09源码+系统+程序+lw文档+部署
    python 对象列表list转字典dict
    第二章:Spring核心思想和IOC和AOP依赖注入
    视频 | 生信Linux - Linux下文件内容操作03
    1. 开篇辞和一些SQL语句基本概念
    【SpringBoot2】-【核心功能】
    最真实的大数据SQL面试题(二)
    C++桶排序算法的应用:存在重复元素 III
    聊聊linux的文件缓存
    Seata 与三大平台携手编程之夏,百万奖金等你来拿
  • 原文地址:https://blog.csdn.net/m0_64694079/article/details/133002399