数据库MVCC(多版本并发控制)原理解析
字数 1113 2025-11-06 12:41:12
数据库MVCC(多版本并发控制)原理解析
一、MVCC概述
MVCC(Multi-Version Concurrency Control)是一种数据库并发控制技术,通过维护数据的多个版本实现读写操作的并发执行。其核心目标是解决读写冲突问题:让读操作不阻塞写操作,写操作也不阻塞读操作,从而提升数据库的并发性能。
二、MVCC核心机制
-
版本链与隐藏字段
数据库每行数据会隐式添加三个关键字段:DB_TRX_ID(6字节):最近修改该行数据的事务IDDB_ROLL_PTR(7字节):回滚指针,指向旧版本数据在undo log中的位置DB_ROW_ID(6字节):隐含自增ID(若表无主键时生成聚簇索引)
-
ReadView机制
每个事务在执行时会生成一个ReadView(读视图),包含:m_ids:当前活跃(未提交)事务ID集合min_trx_id:m_ids中的最小事务IDmax_trx_id:下一个将分配的事务IDcreator_trx_id:创建该ReadView的事务ID
三、MVCC可见性判断流程
当查询数据时,系统按以下步骤判断版本可见性:
- 从最新数据开始,沿版本链遍历每个版本
- 检查版本对应的事务ID(trx_id)与当前ReadView的关系:
- 若 trx_id == creator_trx_id → 当前事务修改的数据,可见
- 若 trx_id < min_trx_id → 事务已提交,可见
- 若 trx_id > max_trx_id → 未来事务修改,不可见
- 若 trx_id ∈ m_ids → 事务未提交,不可见;否则可见
- 找到第一个符合可见性条件的版本即返回
四、实例演示
假设事务T5(事务ID=5)执行查询:
- ReadView: m_ids={3,4}, min_trx_id=3, max_trx_id=6
- 数据行版本链:T3(未提交) ← T2(已提交) ← T1(已提交)
- 判断过程:
- 版本T3: trx_id=3 ∈ m_ids → 不可见
- 版本T2: trx_id=2 < min_trx_id=3 → 可见 → 返回T2版本数据
五、MVCC与隔离级别
- 读已提交(RC):每次查询生成新ReadView,避免脏读但可能不可重复读
- 可重复读(RR):首次查询生成ReadView并复用,保证多次读取数据一致
六、MVCC优势与限制
优势:
- 读写操作互不阻塞
- 避免锁竞争,提升并发性能
- 天然解决脏读问题
限制:
- 需要维护版本链和undo log,增加存储开销
- 长期未提交事务可能导致版本链过长