MySQL核心知识:MVCC是如何解决快照读下的幻读问题的

本文介绍了MVCC(多版本并发控制)如何在MySQL的InnoDB引擎中解决快照读下的幻读问题。MVCC通过隐藏列、undo log和Read View确保并发读写性能,避免事务间数据竞争。在可重复读隔离级别下,快照读基于Read View选取可见版本,避免幻读。MVCC依赖于事务ID和回滚指针来管理记录的多个版本,只返回事务开始时的数据库状态。
摘要由CSDN通过智能技术生成

LBCC

LBCCLock-Based Concurrent Control的简称,意思是基于锁的并发控制,此文主要内容是MVCC,所以LBCC暂时不展开。

当前读

当前读(Locking Read)也称锁定读,读取当前数据的最新版本,而且读取到这个数据之后会对这个数据加锁,防止别的事务更改即通过next-key锁(行锁+gap锁)来解决当前读的问题。

在进行写操作的时候就需要进行“当前读”,读取数据记录的最新版本,包含以下SQL类型:select ... lock in share mode 、select ... for updateupdate 、delete 、insert

因为锁的粒度过大,会导致性能的下降,因此提出了比LBCC性能更优越的方法MVCC

MVCC

MVCCMulti-Version Concurremt Control的简称,意思是基于多版本的并发控制协议,通过版本号,避免同一数据在不同事务间的竞争,只存在于InnoDB引擎下。它主要是为了提高数据库的并发读写性能,不用加锁就能让多个事务并发读写。

MVCC的实现依赖于:三个隐藏字段、Undo logRead View,其核心思想就是:只能查找事务id小于等于当前事务ID的行;只能查找删除时间大于等于当前事务ID的行,或未删除的行。

接下来让我们从源码级别来分析下MVCC

隐藏列

MySQL中会为每一行记录生成隐藏列,接下来就让我们了解一下这几个隐藏列吧。

(1)DB_TRX_ID:事务ID,是根据事务产生时间顺序自动递增的,是独一无二的。如果某个事务执行过程中对该记录执行了增、删、改操作,那么InnoDB存储引擎就会记录下该条事务的id。

(2)DB_ROLL_PTR:回滚指针,本质上就是一个指向记录对应的undo log的一个指针,大小为 7 个字节,InnoDB 便是通过这个指针找到之前版本的数据。该行记录上所有旧版本,在undo log中都通过链表的形式组织。

(3)DB_ROW_ID:行标识(隐藏单调自增 ID),如果表没有主键,InnoDB 会自动生成一个隐藏主键,大小为 6 字节。如果数据表没有设置主键,会以它产生聚簇索引。

(4)实际还有一个删除flag隐藏字段,既记录被更新或删除并不代表真的删除,而是删除flag变了。

undo log

每当我们要对一条记录做改动时(这里的改动可以指INSERT、DELETE、UPDATE),都需要把回滚时所需的东西记录下来, 比如:

  • Insert undo log :插入一条记录时,至少要把这条记录的主键值记下来,
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值