mysql mvcc实现
时间: 2025-05-19 09:11:42 浏览: 33
### MySQL 中 MVCC 的实现机制与工作机制
#### 1. **MVCC 定义**
MVCC 是 Multi-Version Concurrency Control(多版本并发控制)的缩写。它是一种用于管理数据库并发访问的技术,在不牺牲一致性的前提下提升系统的性能[^1]。
#### 2. **MVCC 实现的核心概念**
在 InnoDB 存储引擎中,MVCC 主要依赖以下几个核心概念:
- **隐藏字段**
每一行记录都包含了两个额外的隐藏列:`DB_TRX_ID` 和 `DB_ROLL_PTR`。其中:
- `DB_TRX_ID` 表示插入或更新该行的最后一个事务的 ID。
- `DB_ROLL_PTR` 是一个指针,指向该行之前的版本所在的回滚段(undo log)。通过这个指针可以追溯历史版本的数据[^3]。
- **Undo Log**
Undo 日志用来保存旧版本的数据副本。当某条记录被修改时,其原始版本会被存储到 undo log 中,而新版本则会覆盖原位置上的数据。这样即使其他事务正在读取这条记录的历史版本,也不会受到影响[^4]。
#### 3. **MVCC 工作机制**
##### (1)读操作
根据隔离级别的不同,MVCC 对读操作的支持也有差异:
- **快照读(Snapshot Read)**
快照读不会加锁,而是基于一致性视图(Consistent View),即只查看那些满足条件且属于当前事务可见范围内的记录版本。具体判断逻辑如下:
- 记录未被删除;
- 插入该记录的事务已经提交;
- 更新/删除该记录的事务要么尚未开始,要么已结束并提交[^2]。
- **当前读(Current Read)**
当前读会对所涉及的行加锁以防止幻读现象发生。例如 SELECT ... FOR UPDATE 或者 INSERT/UPDATE/DELETE 等语句都会触发当前读行为[^3]。
##### (2)写操作
对于写操作而言,无论是新增还是更改现有数据项,都需要遵循一定的流程来维护多版本特性:
- 新增一条记录时,直接将其附加至表空间末尾,并设置相应的 DB_TRX_ID 值表示由哪个事务创建了此条目;
- 修改已有记录时,则先复制一份原有状态存放到 Undo Log 后再做实际改动,同时调整目标行中的 DB_TRX_ID 字段反映最新的变更情况;
- 删除某个对象实例同样如此——并非真正意义上物理销毁之,而是标记为“已被移除”,并通过保留足够的上下文信息使得未来可能需要用到这些资料重建过去的状况成为现实可能性之一[^4]。
```sql
-- 示例代码展示如何利用 MVCC 进行查询
SELECT * FROM table_name WHERE condition;
-- 上述 SQL 默认执行的是快照读
SELECT * FROM table_name WHERE condition LOCK IN SHARE MODE;
-- 加上锁定选项后变为当前读形式
```
#### 4. **MVCC 在不同隔离级别下的表现**
| 隔离级别 | RC 下的行为 | RR 下的行为 |
|-------------------|-----------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|
| READ UNCOMMITTED | 不适用 | 不适用 |
| READ COMMITTED | 每次 select 查询都会生成新的快照,看到最新提交的数据 | 只能看到第一次建立的一致性视图 |
| REPEATABLE READ | 使用 MVCC 提供稳定的结果集 | 使用 MVCC 并结合间隙锁避免幻读 |
| SERIALIZABLE | 所有读请求均转化为显式的加锁操作 | 类似于串行化处理 |
---
相关问题
阅读全文
相关推荐




















