MySQL进阶(终篇) | MVCC原理 | 数据库入门到精通 | 无知的我费曼笔记(图文排版无水印)

无知的我正在复习MySQL进阶知识。。。。

笔记特点是 我重新整理了涉及资料的一些语言描述、排版,而使用了自己比较容易理解的描述、同样是回答了一些常见关键问题

如果有遇到有任何无法进展问题或者疑惑的地方,应该在讨论区留言 或者 其他途径以寻求及时的帮助,以加快学习效率 或者 培养独立解决问题的能力、扫清盲点、补充细节

基本概念

当前读

读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。比如说,对于我们日常的操作,如:select … lock in share mode(共享锁),select …for update、update、insert、delete(排他锁)都是一种当前读。

image-20220506231822743

在测试中我们可以看到,即使是在默认的RR隔离级别下,事务A中依然可以读取到事务B最新提交的内容,因为在查询语句后面加上了 lock in share mode 共享锁,此时是当前读操作。当然,当我们加排他锁的时候,也是当前读操作。

快照读

快照读 是什么

简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。

可配置参数

Read Committed:每次select,都生成一个快照读。

Repeatable Read(默认):开启事务后第一个select语句生成一个快照读,其结构是后续语句快照读的地方。

Serializable:快照读会退化为当前读

image-20220506231912338

在测试中,我们看到即使事务B提交了数据,事务A中也查询不到。 原因就是因为普通的select是快照读,而在当前默认的RR隔离级别下,开启事务后第一个select语句才是快照读的地方,后面执行相同的select语句都是从快照中获取数据,可能不是当前的最新数据,这样也就保证了可重复读。

MVCC

全称 Multi-Version Concurrency Control,多版本并发控制

MVCC 是什么

指维护一个数据的多个版本,使得读写操作没有冲突

MVCC 实现原理

快照读为MySQL实现MVCC提供了一个非阻塞读功能。

需要依赖于数据库记录中的三个隐式字段、undo log日志、readView。

隐藏字段

隐藏字段 机制

image-20220506235251507

当我们创建了上面的这张表,我们在查看表结构的时候,就可以显式的看到这三个字段。 实际上除了这三个字段以外,InnoDB还会自动的给我们添加三个隐藏字段

隐藏字段 含义分别是

image-20220506235337131

是否添加最后一个字段DB_ROW_ID,得看当前表有没有主键,如果有主键,则不会添加该隐藏字段。而上述的前两个字段是肯定会添加的

举例说明 查看有主键的表 stu

进入服务器中的 /var/lib/mysql/itcast/ , 查看stu的表结构信息, 通过如下指令:
ibd2sdi stu.ibd

结果是 查看到的表结构信息中,有一栏 columns,只能看到两个隐藏字段分别是:DB_TRX_ID 、DB_ROLL_PTR 。

举例说明 查看没有主键的表 employee

结果是 查看到的表结构信息中,有一栏 column,可以看到全部的隐藏字段。

undolog

undolog 是什么&作用

回滚日志,在增删改的时候产生的用于数据回滚的日志

undolog 机制

当insert的时候,产生的undo log日志在事务提交后,可被立即删除。这是因为其只在回滚时需要

当update、delete的时,产生的undo log日志不会立即被删除。这是因为其在快照读(读历史版本)时仍然被需要

版本链 是什么

当不同事务或相同事务对同一条记录进行修改时,多个事务生成了多个的undo log最终形成一条记录版本链表

版本链 机制——举例说明

准备 有一张表原始数据为

image-20220507001337120

@DB_TRX_ID : 代表最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID,是自增的。

@DB_ROLL_PTR : 由于这条数据是才插入的,没有被更新过,所以该字段值为null。

然后,有四个并发事务同时在访问这张表

A. 第一步。如下

image-20220507001444491

结果是 当事务2执行第一条修改语句时,会记录undo log日志,记录数据变更之前的样子; 然后更新记录,并且记录本次操作的事务ID以及回滚指针。如下

image-20220507001531379

B.第二步

image-20220507001539836

结果是 当事务3执行第一条修改语句时,也会记录undo log日志,记录数据变更之前的样子; 然后更新记录,并且记录本次操作的事务ID以及回滚指针。如下

image-20220507001614700

readview

是什么&作用

(读视图)是 快照读 SQL 执行时,能够让MVCC提取对应数据的依据,记录并维护系统当前活跃的事务(未提交的)id。

ReadView 内容 四个字段

image-20220507002227295

readview 作用是 规定了访问 版本链数据 的规则

@trx_id 代表当前undolog版本链对应事务ID

image-20220507002319021

机制 不同的隔离级别,生成ReadView的时机不同

READ COMMITTED :在事务中每一次执行快照读时生成ReadView。

REPEATABLE READ:仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。

MVCC 机制

当RC隔离级别

举例说明

下面是根据事务生成的ReadView

image-20220507003719144

下面是每次提交事务生成的版本链&第一次快照读的ReadView

image-20220507003754312

在进行匹配时,会从取版本链中的第一个undo log事务id(就是trx_id)和 ReadView根据规则进行推导,从而得出结论,最后根据该结论操作。如果都不匹配则继续向下进行挨个匹配。

当RR隔离级别

与RC隔离级别 在根本上唯一不同的是生成RedView的机制。如下

image-20220507004631375

知识回顾&小结

MVCC的实现原理就是通过 InnoDB表的隐藏字段、UndoLog 版本链、ReadView来实现的。

事务的隔离性通过 MVCC + 锁 实现

事务的一致性通过 redolog 与 undolog

image-20220507004556544

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值