深度解析Mysql中MVCC的工作机制

MVCC,多版本并发控制

  • 定义:维护一个数据的多个版本 ,使读写操作没有冲突,依赖于:隐藏字段,undo log日志,readView

  • MVCC会为每条版本记录保存三个隐藏字段

    1. DB_TRX_ID : 记录最近插入或修改该记录的事务ID
    2. DB_ROLL_PTR :回滚指针,指向这条记录的上个版本,配合undo log
    3. DB_ROW_ID隐藏主键,如果没有指定主键,将会生成该隐藏主键

    流程(重点):在修改数据前,innodb引擎会在undo log 日志拷贝一份原记录 ,并将其DB_ROLL_PTR指向上一个版本 ,形成版本链 。然后修改数据值 ,并把DB_TRX_ID 改为当前执行的事务ID

  • readView

    1. 定义:确定事务在快照读时 能够看到数据库中的哪些数据版本

    2. 区分:

      当前读 :读取的是记录的最新版本 ,对读取的记录加锁 ,保证读取时其他并发事务不能修改当前记录,解决幻读

      快照读 :select查询,不加锁,读取记录数据的可见版本 (通过事务ID递增性判断是否可见)

      1. Read Commited每次select都生成一个readView,读取可见记录中的最新版本,会造成不可重复读的问题
      2. Repetable Read :事务首次 select时生成 readView,后续复用该readView**
  1. 定义:确定事务在快照读时 能够看到数据库中的哪些数据版本

  2. 区分:

    当前读 :读取的是记录的最新版本 ,对读取的记录加锁 ,保证读取时其他并发事务不能修改当前记录,解决幻读

    快照读 :select查询,不加锁,读取记录数据的可见版本 (通过事务ID递增性判断是否可见)

    1. Read Commited每次select都生成一个readView,读取可见记录中的最新版本,会造成不可重复读的问题
    2. Repetable Read :事务首次 select时生成 readView,后续复用该readView
  3. 流程:基于快照读 生成的readview ,跟要查询的行数据的mvcc版本DB_TRX_ID 做比较,基于事务ID的递增性 判断mvcc版本 是否对当前readview可见 ,如果可见则返回当前mvcc版本的行数据,如果不可见 ,则通过mvcc的回滚指针回退到上一个版本。

  4. 判断MVCC版本是否对当前readView可见:mvcc版本的DB_TRX_ID字段readView的字段比较,满足以下任意条件:

    • DB_TRX_ID < min_trx_id(最小事务ID):该版本的事务比所有活跃事务(正在运行)更早创建且已提交,因此可见
    • DB_TRX_ID = creator_trx_id(创建该readview的事务ID):当前事务自己生成的版本(即使未提交),对自己总是可见
    • DB_TRX_ID < max_trx_id (预分配事务ID)&& DB_TRX_ID not in m_ids(活跃的事务ID列表中): 该版本的事务不在创建 read view 时的活跃事务列表中,说明已提交
相关推荐
Tisfy3 小时前
LeetCode 1927.求和游戏:抵消+看最值
java·leetcode·游戏·题解·博弈论
Elastic 中国社区官方博客7 小时前
搜索倍增器:推动收入、生产力和 AI 实现规模化
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
东风破_8 小时前
从输入 juejin.cn 到看到页面:DNS、Nginx、服务器集群与 CDN 到底在做什么?
后端·mysql
小成很成8 小时前
mysql 8.0.21 升级 mysql 8.0.45(经过生产环境验证)
android·mysql·adb
东风破_8 小时前
从 0 设计一个博客数据库:用户、头像与文章表应该怎么建?
后端·mysql
大鸡腿同学8 小时前
黄仁勋点透的 AI 真相:能实现你知道但做不到的,却实现不了你不知道的
后端
FfHUCisI9 小时前
Go 编译过程全景
开发语言·后端·golang
FfHUCisI9 小时前
Golang 语法分析与 AST:Parser 与 go/ast
开发语言·后端·golang
保定公民9 小时前
达梦数据库存储过程中的数组类型详解:基础数组与记录数组的差异化应用
数据库·达梦·存储过程·达梦数据库·dm8·dm
秋饼9 小时前
JDK 27 企业级 AI 服务落地实战:G1 默认、紧凑对象头、后量子 TLS 与 JFR 脱敏全解析
java·ai·技术分享·后端开发