详解MySQL的MVCC原理

详解MySQL的MVCC原理

MVCC(多版本并发控制)

1. MVCC解决了什么问题?

在保证事务隔离性的前提下,让读操作尽可能无锁化。

  • 隔离性
  • 无锁

传统并发控制常用 锁机制(Locking):

  • 读加共享锁(S Lock)
  • 写加排他锁(X Lock)

MVCC 的核心思想是:

读不加锁,写不阻塞读,通过维护数据的多个版本实现并发控制

MVCC

  • 保证「读已提交
    • 每次执行 SELECT 都创建新的 Read View
  • 保证「可重复读
    • 事务只有第一次读取时生成 Read View
    • 后续所有读取都使用同一个快照

2. 什么是快照读和当前读?

快照读

  • 读取某个时间点的数据快照,而不是最新数据。
  • 实现:MVCC(多版本并发控制) + Read View(读视图)
  • 读“历史版本”,不加锁。

当前读

  • 读取数据库中“当前最新版本”的数据,并保证读取结果可用于后续写操作

只要涉及:必须当前读 + 加锁。

3. MVCC的核心元素有哪些?

事务ID + 隐藏字段 + Undo Log + 版本链 + Read View

  1. InnoDB 为每一行数据维护隐藏信息
字段 作用
trx_id 创建或最后修改该行的事务 ID
roll_pointer 指向 Undo Log 中旧版本
  1. Undo Log(回滚日志)+ 版本链
  2. Read View(读视图)
  3. 事务 ID

4. MVCC 的核心思想

1
2
3
4
5
6
7
8
9
10
11
12
13
事务开始

执行 SELECT

生成 Read View

读取记录最新版本

判断是否可见

不可见 → 沿 Undo Log 查历史版本

返回可见版本

Read View 在 MVCC 里如何工作的?