不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • MySQL

    • 01.安装MySQL
    • 02.MySQL事务
    • 03.MySQL锁
    • 04.MySQL索引 ✅
    • 05.MySQL慢查询
    • 06.MySQL优化
    • 07.binlog redolog undolog ✅
    • 08.MVCC原理 ✅
      • 01.MVCC原理
        • 1、MVCC概述
        • 2、快照读和当前读
        • 3、MVCC 实现原理
        • 1)MVCC隐藏字段
        • 2)MVCC 的 可见性算法
    • 09.SQL执行过程 ✅
    • 10.MySQL主从同步
    • 11.MySQL主从配置
    • 12.MySQL和Redis一致性
    • 13.MySQL查询缓存
    • 90.其他
    • 95.MySQL管理
    • 96.MySQL基本查询
    • 97.创建表结构
    • 98.SQL语句面试50题
    • 99.FAQ
  • Redis

  • Elasticsearch

  • Kafka

  • Etcd

  • MongoDB

  • TiDB

  • RabbitMQ

  • 数据库
  • MySQL
xiaonaiqiang
2022-04-07
目录

08.MVCC原理 ✅常识原理

MVCC(多版本并发控制)是数据库系统中的一种乐观并发控制方式,通过可见性算法实现高效的并发访问。

MVCC的两种读形式包括快照读(无需加锁,读取当前事务可见版本)和当前读(读取最新版本,涉及增删改操作)。

MVCC通过隐藏字段(如RowID、事务ID、回滚指针)和undo log(记录事务操作的日志)来实现。

可见性算法通过比较事务ID和系统活跃事务列表判断数据对当前事务的可见性,从而避免了锁的使用带来的性能问题。

# 01.MVCC原理

参考 (opens new window)

# 1、MVCC概述

  • MySQL 的 MVCC(多版本并发控制)机制用于解决读写冲突,保证事务的隔离性
  • 其底层原理主要基于每行数据的版本管理和事务的快照隔离
  • 每当对行数据进行修改时,MySQL 会生成一个新的版本,而不是直接修改原有数据
  • 这是通过在每行数据中增加两个隐藏列来实现的
    • 一个是 trx_id,表示修改该行的事务 ID
    • 另一个是 delete_flag,用于标记行是否已被删除

# 2、快照读和当前读

  • 快照读:

    • 读取的只是当前事务的可见版本,不用加锁
    • 而你只要记住 简单的 select 操作就是快照读(select * from table where id = xxx)
  • 当前读:

    • 读取的是当前最新版本,比如 特殊的读操作,更新/插入/删除操作
    • 当前读会被其他事务的写操作阻塞,确保读取的是最新的数据状态

# 3、MVCC 实现原理

# 1)MVCC隐藏字段

  • MVCC 使用了“三个隐藏字段”来实现版本并发控制
RowID DB_TRX_ID DB_ROLL_PTR id name password
自动创建的id 事务id 回滚指针 id name password
  • RowID:隐藏的自增ID,当建表没有指定主键,InnoDB会使用该RowID创建一个聚簇索引
  • DB_TRX_ID:最近修改(更新/删除/插入)该记录的事务ID
  • DB_ROLL_PTR:回滚指针,指向这条 记录的上一个版本
  • 删除标记(Delete Flag):指示该行是否已被逻辑删除

# 2)MVCC 的 可见性算法

  • undoLog: 事务的回滚日志,是 可见性算法 的非常重要的部分,分为两类

    • insert undo log:

      • 事务在插入新记录产生的undo log,当事务提交之后可以直接丢弃
    • update undo log:

      • 事务在进行 update 或者 delete 的时候产生的 undo log,在快照读的时候还是需要的,所以不能直接删除

      • 只有当系统没有比这个log更早的read-view了的时候才能删除

      • ps:所以长事务会产生很多老的视图导致undo log无法删除 大量占用存储空间

  • read-view: 读视图,是MySQL秒级创建视图的必要条件

    • 比如一个事务在进行 select 操作(快照读)的时候会创建一个 read-view ,这个read-view 其实只是三个字段
    • alive_trx_list:read-view生成时所有活跃事务 ID 列表
    • up_limit_id:记录上面的 alive_trx_list 中的 最小事务 ID
    • low_limit_id:目前已出现的事务ID的最大值 + 1(表示将来可能出现的事务的下限)
  • 可见性算法规则 指的是 当前事务 对特定数据记录的可见性判断
  • 当前事务:是正在执行某些操作的事务,它有自己的事务 ID
  • DB_TRX_ID:
    • 最后一次对特定数据行进行修改的事务的 ID(插入、更新或删除操作)
  • 1)比 读视图最小事务ID 还小(可见)

    • 比较 DB_TRX_ID(最近修改事务ID) 与 up_limit_id(前读视图中 最小事务 ID)
    • 如果 最近修改事务ID ≤ 最小事务 ID,当前事务可以看到该记录(否则,进入下一步判断)
  • 2)比 读视图当时最大事务ID还大(不可见)

    • 比较 DB_TRX_ID最近修改事务ID) 与 low_limit_id(前读视图中 事务ID的最大值 + 1)
    • 如果 最近修改事务ID ≥ 事务ID的最大值 + 1,则当前事务无法看到该记录(否则,进入下一步判断)
  • 3)如果最近修改事务已经完成提交(可见)

    • 判断 DB_TRX_ID(最近修改事务ID) 是否在活跃事务的数组中
    • 如果在活跃事务列表中,则该记录尚未提交,对当前事务不可见
    • 如果不在,则该记录已提交,当前事务可见

#转载
上次更新: 2025/4/29 17:38:19
07.binlog redolog undolog ✅
09.SQL执行过程 ✅

← 07.binlog redolog undolog ✅ 09.SQL执行过程 ✅→

最近更新
01
04.数组双指针排序_子数组
03-25
02
08.动态规划
03-25
03
06.回溯算法
03-25
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式