mysql mvcc
MySQL MVCC (多版本并发控制) 机制详解
MVCC (Multi-Version Concurrency Control) 是 MySQL InnoDB 存储引擎实现高并发读写的核心技术,它通过数据多版本来避免读写冲突,同时保证事务的隔离性。
一、MVCC 核心原理
1. 版本链结构
InnoDB 每行记录都包含两个隐藏字段:
-
DB_TRX_ID
:最近修改该行的事务ID -
DB_ROLL_PTR
:指向 undo log 的回滚指针,形成版本链
2. ReadView 机制
每个事务启动时会生成一个 ReadView,包含:
-
m_ids
:当前活跃事务ID集合 -
min_trx_id
:最小活跃事务ID -
max_trx_id
:预分配的下一个事务ID -
creator_trx_id
:创建该 ReadView 的事务ID
二、MVCC 工作流程
1. 查询数据时的可见性判断
对于每行数据,通过比较版本号确定是否可见:
-
如果
DB_TRX_ID
<min_trx_id
:说明数据在事务开始前已提交,可见 -
如果
DB_TRX_ID
>=max_trx_id
:说明数据在事务开始后修改,不可见 -
如果
min_trx_id
<=DB_TRX_ID
<max_trx_id
:-
如果
DB_TRX_ID
在m_ids
中:说明事务未提交,不可见 -
否则:事务已提交,可见
-
2. 不同隔离级别的实现
-
READ UNCOMMITTED:直接读取最新数据,不使用 MVCC
-
READ COMMITTED:每次查询生成新 ReadView
-
REPEATABLE READ:事务第一次查询时生成 ReadView,后续复用
-
SERIALIZABLE:退化为加锁方式,不使用 MVCC
三、MVCC 关键优势
-
读写不阻塞:读操作不需要等待写锁释放
-
非锁定读:通过版本链实现一致性读
-
高效回滚:利用 undo log 快速回滚到指定版本
四、MVCC 实现细节
1. undo log 作用
-
存储数据修改前的版本
-
用于事务回滚和 MVCC 版本链构建
-
分为 insert undo log 和 update undo log