
mvcc原理
MVCC(多版本并发控制)理解与改进
概述
MVCC(Multi-Version Concurrency Control)是一种无锁的并发控制机制,主要用于实现数据库事务的隔离级别,如读已提交和可重复读。其核心思想是通过维护数据的多个版本来支持并发的读写操作。
实现机制如下
事务与数据版本
假设有两个事务,事务A和事务B:
-
事务A对数据进行修改,将“张三”改为“李四”。此时:
- “李四”是最新的数据。
- “张三”是旧数据,保存在undo log(回滚日志)中。
-
每条记录包含三个隐藏列,其中一个是回滚指针,用于连接旧版本,形成一个链表。链表的首节点是当前最新的记录。
-
隐藏字段中还有一个字段记录当前操作的事务ID。例如,事务A的ID是10,则“李四”这条记录的存的事务ID为10。
读视图的生成
当事务B进行查询时,会生成一个读视图(Read View),该视图维护以下四个属性:
- 当前事务ID:假设事务B的ID是20。
- 当前最小未提交事务ID:表示当前活跃的未提交事务中,最小的事务ID。
- 下一个事务ID:如果当前最大事务ID是20,则这里是21。
- 所有未提交事务集合:按事务ID从小到大排序的集合。
数据读取规则
在查询时,按照以下规则判断可读取的数据:
-
当前事务ID与数据事务ID对比:
- 如果相等,表示该数据是当前事务操作的,可以直接读取。
-
数据事务ID小于当前最小未提交事务ID:
- 表示该数据已提交。如果当前隔离级别是读已提交,可以直接读取数据。
-
数据事务ID大于下一个事务ID:
- 表示该数据在创建读视图后被修改,不能读取,进行下一条数据判断。
-
数据事务ID在最小和最大事务ID之间:
- 表示该数据正被当前活跃的未提交事务操作。如果当前隔离级别是读已提交,则不能读取,进行下一条数据判断。
通过上述规则逐一匹配,可以找到最终要读取的数据。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 王德明
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果