Mvcc 如何解决脏读、不可重复读问题

本文详细阐述了Mvcc(多版本并发控制)的设计目的,涉及undoLog版本链的使用、readview的构建以及查询步骤,以确保在不同隔离级别下避免脏读和不可重复读问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mvcc (多版本并发控制) 设计目的:

为了解决数据库不同隔离级别下出现的脏读、不可重复读问题


主要组成: 

undoLog 版本链

        1. update | select 操作时、将每次操作记录到 undoLog 中

        2. undolog 中记录了 roll_pointer 引用信息、通过roll_pointer 组成一条版本链

        3. 通过 undoLog 版本链记录某条数据的版本变更信息

readView 读视图

        1. 查询时会记录 undoLog 版本链的统计信息

        2. 版本链统计信息

                2.1 m_ids 当前活跃事务id (未提交事务id)

                2.2 min_trx_id 最小活跃事务id

                2.3 max_trx_id 最大活跃事务 id + 1(undoLog 版本链头事务id + 1)

                2.4 creator_trx_id 创建 readView 的事务id


查询步骤

        1. 查询时先记录readView 读视图 记录版本链的统计信息

        2. 遍历undoLog 版本链 (链头 -> 链尾)

                2.1 undoLog 版本链事务id = 当前事务 id 表示这条数据是当前事务更改的可以返回

                2.2 如果 undoLog 版本链事务id < min_trx_id 最小事务id、表示在创建readView 之前当前事务已经提交、可以被访问

                2.3 undoLog 版本链事务id > max_trx_id 最大事务id、表示当前事务是在 readView 生成后创建的不可以被访问

                2.4 undoLog 版本链事务id 在 min_trx_id 与 max_trx_id 之间、并且不在活跃事务 m_ids 中表示当前事务已经被提交、可以被访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值