mysql面试高频问题---事务-MVCC多版本并发控制(难)🚬

MVCC多版本并发控制

1. 问题

锁:排他锁(如一 个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁)
mvcc:多版本并发控制
2. MVCC多版本并发控制
MVCC全称Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突

MVCC的具体实现,主要依赖于数据库记录中的隐式字段、undo log日志、readView。
例如:下面有4个事务,事务2、3、4对该记录都进行了操作,那么在事务5中的两条查询语句是查询的哪个事务版本的记录呢?

MVCC的实现原理:

  1. 记录中的隐藏字段

  2. undo log 回滚日志
    a. 回滚日志,在insert、 update、 delete的时候产生的便于数据回滚的日志。
    b. 当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除
    c. 而update、delete的时候, 产生的undo log日志不仅在回滚时需要,mvcc版本访问也需要,不会立即被删除

  3. undo log 版本链
    不同事务或相同事务对同一条记录进行修改,会导致该记录的undo log生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。

  4. readview
    ReadView (读视图)是 快照读 SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的) id。
    a. 当前读:读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:
    select … lock in share mode(共享锁),select … for update、update、 insert、 delete(排他锁)都是一 种当前读。
    b. 快照读:简单的select (不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。
    Read Committed:每次select, 都生成一个快照读。
    Repeatable Read:开启事务后第一个select语句才是快照读的地方。

举例说明:

当前读:不受隔离级别影响,事务A的两次select都是读到的最新的数据
快照读:不同的隔离级别不一样,RC读出来不一样,RR读出来都是相同的,获得的结果就是快照读

ReadView包含的四个核心字段:


不同的隔离级别,生成ReadView的时机不同:
➢ READ COMMITTED :在事务中每一 次执行快照读时生成ReadView。
➢ REPEATABLE READ:仅在事务中第一 次执行快照读时生成ReagView,后续复用该ReadView。

3. 总结

4. 问答

posted @   xiaolifc  阅读(94)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2022-02-23 【转】cron表达式详解
点击右上角即可分享
微信分享提示