不做大哥好多年 不做大哥好多年
首页
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 100.微服务
  • MySQL
  • Redis
  • Elasticsearch
  • MongoDB
  • Kafka
  • Etcd
  • RabbitMQ
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • Docker
  • K8S
  • 容器原理
  • Istio
  • VUE
  • HTML
  • CSS
  • JavaScript
  • 数据结构
  • 算法基础
  • 算法题分类
  • 算法题整理
  • 01.Python基础
  • 02.MySQL
  • 03.Redis
  • 04.算法
  • 05.项目技术点
  • 06.项目部署
  • 07.面试其他问题
  • 08.GO
  • 简历
  • 腾讯蓝鲸
GitHub (opens new window)

肖乃强

不做大哥好多年
首页
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 100.微服务
  • MySQL
  • Redis
  • Elasticsearch
  • MongoDB
  • Kafka
  • Etcd
  • RabbitMQ
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • Docker
  • K8S
  • 容器原理
  • Istio
  • VUE
  • HTML
  • CSS
  • JavaScript
  • 数据结构
  • 算法基础
  • 算法题分类
  • 算法题整理
  • 01.Python基础
  • 02.MySQL
  • 03.Redis
  • 04.算法
  • 05.项目技术点
  • 06.项目部署
  • 07.面试其他问题
  • 08.GO
  • 简历
  • 腾讯蓝鲸
GitHub (opens new window)
  • MySQL

    • 01.安装MySQL
    • 02.MySql事务
    • 03.MySQL锁
    • 04.MySQL索引
    • 05.MySQL慢查询
    • 06.MySQL优化
    • 07.MySQL主从同步
    • 08.mysql主从配置与实战
    • 09.MySQL管理
    • 10.MySQL基本查询
    • 11.MVCC原理
      • 01.MVCC原理
        • 1.1 MVCC多版本并发控制
        • 1.2 MVCC 的两种读形式
        • 1.3 MVCC 的实现原理
        • 1、MVCC隐藏字段
        • 2、MVCC 的 可见性算法
    • 97.创建表结构
    • 98.sql语句面试50题
    • 99.FAQ
  • Redis

  • Elasticsearch

  • MongoDB

  • Kafka

  • Etcd

  • RabbitMQ

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

11.MVCC原理

# 01.MVCC原理

参考 (opens new window)

# 1.1 MVCC多版本并发控制

  • MVCC多版本并发控制 ,它是数据库管理系统一种常见的并发控制。
  • 我们知道并发控制常用的是锁,当线程要对一个共享资源进行操作的时候,加锁是一种非常简单粗暴的方法
  • 这种锁是一种 悲观 的实现方式,也就是说这会给其他事务造成堵塞,从而影响数据库性能。
  • MVCC 只是一种 乐观 的实现形式,它是通过 一种 可见性算法 来实现数据库并发控制。

# 1.2 MVCC 的两种读形式

在讲 MVCC 的实现原理之前,我觉很有必要先去了解一下 MVCC 的两种读形式

  • 快照读:读取的只是当前事务的可见版本,不用加锁
    • 而你只要记住 简单的 select 操作就是快照读(select * from table where id = xxx)
  • 当前读:读取的是当前版本,比如 特殊的读操作,更新/插入/删除操作

# 1.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:回滚指针,指向这条记录的上一个版本

  • 其实还有一个删除的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:read-view生成时刻,目前已出现的事务ID的最大值 + 1。

可见性算法规则

  • 1)首先比较这条记录的 DB_TRX_ID(最近修改事务ID) 是否是 小于等于up_limit_id(read-view生成时刻系统中正在活跃的事务id)
    • 如果满足,那么说明当前事务能看到这条记录,如果大于则进入下一轮判断
  • 2)然后判断这条记录的 DB_TRX_ID(最近修改事务ID) 是否 大于等于low-limit-id(read-view生成时刻,目前已出现的事务ID的最大值+1)
    • 如果大于等于则说明此事务无法看见该条记录,不然就进入下一轮判断
  • 3)判断该条记录的 DB_TRX_ID(最近修改事务ID) 是否在活跃事务的数组中
    • 如果在则说明这条记录还未提交对于当前操作的事务是不可见的,如果不在则说明已经提交,那么就是可见的

编辑 (opens new window)
上次更新: 2022/09/21, 11:19:29
10.MySQL基本查询
97.创建表结构

← 10.MySQL基本查询 97.创建表结构→

最近更新
01
15.redis淘汰策略
09-20
02
21.regexp2
09-16
03
01.istio
09-16
更多文章>
Theme by Vdoing | Copyright © 2019-2022 肖乃强 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式