MySQL mvcc
时间: 2025-05-17 13:04:55 浏览: 41
### MySQL 中 MVCC 的工作原理及其实现方式
MySQL 使用多版本并发控制(MVCC, Multi-Version Concurrency Control)来支持事务隔离级别,尤其是在 InnoDB 存储引擎中。以下是关于其工作机制和实现的关键点:
#### 1. **MVCC 基本概念**
MVCC 是一种通过保存数据的历史版本来提高数据库性能的技术。它允许读写操作并行执行而不会相互阻塞。InnoDB 实现了 MVCC 来满足 ACID 属性以及不同的事务隔离级别。
在 InnoDB 中,每行记录都包含了两个隐藏字段用于维护 MVCC:
- `DB_TRX_ID`:表示最后一次对该行进行修改的事务 ID。
- `DB_ROLL_PTR`:指向该行之前的某个旧版本的数据位置(undo log)。这些历史版本存储在 undo 日志中[^1]。
#### 2. **Undo Log 和 Read View**
为了实现 MVCC,InnoDB 利用了 Undo Log 和 Read View 这两种机制:
- 当某条记录被更新或者删除时,原始版本会被保留到 Undo Log 中。
- 对于只读查询(SELECT),如果当前看到的是最新版本,则可能不符合特定时间点的一致性视图;此时会利用 Undo Log 查找合适的过去版本。
Read View 定义了一个快照,使得同一时刻发起的不同一致性读能够共享相同的可见状态集合。具体来说,在每次新启动一个可重复读级别的事务之前都会创建一个新的 read view ,这个视图决定了哪些更改对于此事务而言是不可见的[^2]。
#### 3. **不同隔离级别下的行为差异**
根据所选的隔离级别,MVCC 表现出的行为有所不同:
- **READ UNCOMMITTED**: 不使用 MVCC,直接返回最新的已提交或未提交的数据版本。
- **READ COMMITTED**: 每次 select 都会产生新的 read view 。这意味着即使同一个事务内的多次查询也可能得到不一样的结果集因为其他事务已经完成了 commit 并产生了影响。
- **REPEATABLE READ**: 整个交易期间保持单一不变的readview ,从而确保无论何时重做相同条件的选择语句都能获得一致的结果除非显式锁定表/行。
- **SERIALIZABLE**: 转变为完全加锁模式运行即所有的selects自动转换成locking selects形式以防止幻影现象发生.
#### 4. **清理过期版本(VACUUM 类似功能)**
随着时间推移,越来越多的老版本数据变得不再需要(没有任何活动中的transaction还需要它们),因此有必要定期回收空间资源。这项任务由后台线程完成称为purge process负责扫描那些可以安全丢弃掉无用副本们同时释放关联磁盘区域给操作系统重新分配用途[^3].
```sql
-- 示例展示如何查看当前正在使用的事务及其对应的trx_id
SHOW ENGINE INNODB STATUS;
```
---
阅读全文
相关推荐


















