MVCC 原理
MVCC 基本概念
什么是 MVCC?
为什么需要 MVCC?
-- 事务 A:读操作
BEGIN;
SELECT * FROM t WHERE id = 1; -- 加读锁
-- 持有锁很长时间...
-- 事务 B:写操作
BEGIN;
UPDATE t SET a = 1 WHERE id = 1; -- ⏳ 等待读锁释放
-- 读阻塞了写,并发性能差MVCC 的核心思想
MVCC 只在哪些隔离级别下工作?
MVCC 的三大组件 ⭐⭐⭐⭐⭐
1. 隐藏列(Hidden Columns)
列名
长度
作用
2. Undo Log 版本链
3. Read View(读视图)⭐⭐⭐⭐⭐
字段
含义
Read View 详解
Read View 的创建时机
READ COMMITTED(RC)
REPEATABLE READ(RR)
Read View 的作用
可见性判断算法 ⭐⭐⭐⭐⭐
判断规则
规则 1:当前事务自己修改的,可见
规则 2:版本在 Read View 创建前就已提交,可见
规则 3:版本是在 Read View 创建后才开始的,不可见
规则 4:版本的事务在 Read View 创建时是否活跃
完整算法(伪代码)
可见性判断示例
RC 和 RR 的 MVCC 区别 ⭐⭐⭐⭐⭐
核心区别
隔离级别
Read View 创建时机
结果
详细示例
场景设置
READ COMMITTED 场景
REPEATABLE READ 场景
对比总结
MVCC 完整示例
示例 1:单事务修改,多事务读取
示例 2:多个版本的查找
MVCC 的局限性
1. 只对快照读有效 ⭐⭐⭐⭐⭐
2. 无法解决当前读的幻读
3. 写操作不使用 MVCC
总结
面试高频问题 ⭐⭐⭐⭐⭐
Q1: 什么是 MVCC?
Q2: MVCC 的实现原理?
Q3: RC 和 RR 的 MVCC 有什么区别?
Q4: MVCC 如何判断版本可见性?
Q5: 快照读和当前读的区别?
Q6: MVCC 能完全解决幻读吗?
Q7: 为什么 UPDATE 语句是当前读?
Q8: MVCC 的优缺点?
总结
核心要点 ⭐⭐⭐⭐⭐
记住这些关键点
学习建议
Last updated