详解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
- InnoDB 为每一行数据维护隐藏信息
| 字段 | 作用 |
|---|---|
| trx_id | 创建或最后修改该行的事务 ID |
| roll_pointer | 指向 Undo Log 中旧版本 |
- Undo Log(回滚日志)+ 版本链
- Read View(读视图)
- 事务 ID
4. MVCC 的核心思想
1 | |