MySQL 中的 MVCC 是什么?

MySQL 中的 MVCC 是什么

MVCC全称多版本并发控制,InnoDB特有 。核心作用:实现不加锁的读,解决读写冲突,读不阻塞写、写不阻塞读,提升数据库并发性能。

MVCC只作用于快照读(普通select) ;select ... for update这种当前读,是走锁机制,不使用MVCC。

底层三个基础部件

  1. 隐藏列,每条行记录自带3个隐藏字段
  • DB_TRX_ID:事务ID,记录最后修改这条数据的事务编号;
  • DB_ROLL_PTR:回滚指针,指向undo log里的旧版本数据;
  • DB_ROW_ID:如果没有主键,生成隐藏主键。
  1. undo log(回滚日志)

    数据被修改时,把修改前的旧数据保存到undo log。通过DB_ROLL_PTR,把一条数据的多个历史版本串成一条版本链。一条记录可以存在多个历史快照版本。

  2. Read View(读视图)

    事务做快照读的时候生成的视图,用来做可见性判断,用来判定:当前事务能不能看到版本链里的这条记录。

    Read View里面4个核心数据:

  • m_ids:当前数据库活跃、还没有提交的事务ID集合
  • min_trx_id:m_ids里面最小的事务id
  • max_trx_id:下一个将要分配的事务id,等于最大活跃id+1
  • creator_trx_id:当前执行select的事务自己的ID

可见性判断逻辑(简化)

拿版本链中某条记录的DB_TRX_ID和Read View对比:

  1. 如果记录trx_id == 当前事务creator_trx_id → 自己修改的数据,可以看见;
  2. 如果记录trx_id < min_trx_id → 事务已经提交,可以看见;
  3. 如果记录trx_id >= max_trx_id → 这个事务在本事务之后开启,看不见;
  4. 如果trx_id落在min和max之间:判断是否在m_ids活跃集合,在集合代表还没提交,不可见;不在集合代表已经提交,可以见。

如果当前版本不可见,顺着回滚指针,去版本链找上一个历史版本,重复判断,直到找到可以看见的版本,或者直接返回无数据。

RC 和 RR隔离级别下MVCC最大区别:Read View生成时机

  1. RC(读已提交) :每一次select,都会生成全新Read View。所以可以读到其他事务刚刚提交的数据,会出现不可重复读。
  2. RR(可重复读,MySQL默认) :整个事务,第一次执行select的时候生成一份Read View,之后所有select复用同一个。整个事务快照不变,实现可重复读。

MySQL的RR级别,依靠MVCC+间隙锁共同解决幻读问题。

快照读 vs 当前读

  • 快照读:普通select,走MVCC,不加锁,读取历史版本;
  • 当前读:select ... for update / lock in share mode / update / delete / insert,读取最新数据,加行锁,不走MVCC。

MVCC优缺点

  • 优点:读写互不阻塞,极大提升并发,读操作不上锁;
  • 缺点:undo log会保存大量历史版本,占用存储空间;后台purge线程定期清理过期undo版本;旧版本过多会影响性能。

总结:

MVCC就是多版本并发控制,依靠隐藏列、undo log版本链、Read View读视图;普通select快照读通过Read View规则从版本链选出可见版本,做到读不加锁;RC每次查询生成Read View,RR事务首次查询生成Read View;MVCC只处理快照读,当前读依靠锁。

相关推荐
通信瓦工1 小时前
利用浊度和电导率测量确定乙二醇基流体的质量
网络·数据库·ai
小马同学-2 小时前
mysql数据库原理
数据库·mysql
东方护航数据恢复(深圳)2 小时前
政务信创案例:达梦 DM8 数据库掉电页损坏,48 小时修复实录【东方护航数据恢复深圳店】
数据库·数据恢复·it运维·服务器数据恢复·二次开盘·硬盘开盘
AC赳赳老秦3 小时前
OpenClaw 数据引用规范自动生成:为公开数据构建可信来源标注与标准引用体系
大数据·开发语言·汇编·数据库·人工智能·deepseek·openclaw
小蒜学长4 小时前
校园社团招新网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·校园社团招新网站
布莱克6055 小时前
MySQL 增删改查(CRUD)语法详解
数据库·mysql·增删改查
Dovis(誓平步青云)5 小时前
几个方案来回选不定?做一个随时切换的候选推荐页
android·java·服务器·开发语言·javascript·数据库·智能化
2501_933670796 小时前
2027届大数据管理与应用求职数字化转型顾问:项目、SQL、业务理解怎么排优先级
数据库·sql
东方护航数据恢复(深圳)6 小时前
物流案例:勒索病毒 Mallox 加密 ERP 数据库,旧备份 + 残留页重组实录【东方护航数据恢复深圳店】
数据库·数据恢复·勒索病毒·二次开盘·开盘·数据镜像
.Hypocritical.7 小时前
Redis从入门到实战:核心原理、场景落地与避坑指南
数据库·redis·缓存