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

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 中表示当前事务已经被提交、可以被访问

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
脏读、幻读和不可重复读是在并发环境下常见的数据一致性问题。以下是解决这些问题的几种方法: 1. 锁机制:使用锁机制可以确保在某个事务对数据进行读写时,其他事务无法访问该数据。这包括共享锁(读锁)和排他锁(写锁)。通过正确地使用锁,可以避免脏读、幻读和不可重复读问题。 2. 事务隔离级别:数据库系统提供了多个事务隔离级别,如读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。选择合适的隔离级别可以解决不同程度的并发问题。 3. MVCC(多版本并发控制):MVCC 是一种并发控制机制,通过为每个事务创建不同的数据版本来解决并发问题。每个事务只能看到它开始之前的数据快照,避免了幻读和不可重复读问题。 4. 乐观并发控制:乐观并发控制假设事务冲突较少,并且通过在事务提交前进行冲突检测来解决并发问题。常见的实现方式是使用版本号或时间戳来标识数据版本,如果检测到冲突,则回滚事务。 5. 使用索引:合理使用索引可以提高并发访问效率,减少锁的竞争。通过在查询中使用适当的索引,可以减少数据行的扫描和锁定的范围,从而减少脏读不可重复读问题。 需要根据具体情况选择合适的解决方案,并进行合理的设计和调整。同时,对于一些特殊场景下的并发问题,可能需要进行更加深入的研究和解决方案的定制化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值