无知的我正在复习MySQL进阶知识。。。。
笔记特点是 我重新整理了涉及资料的一些语言描述、排版,而使用了自己比较容易理解的描述、同样是回答了一些常见关键问题
如果有遇到有任何无法进展问题或者疑惑的地方,应该在讨论区留言 或者 其他途径以寻求及时的帮助,以加快学习效率 或者 培养独立解决问题的能力、扫清盲点、补充细节
基本概念
当前读
读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。比如说,对于我们日常的操作,如:select … lock in share mode(共享锁),select …for update、update、insert、delete(排他锁)都是一种当前读。
在测试中我们可以看到,即使是在默认的RR隔离级别下,事务A中依然可以读取到事务B最新提交的内容,因为在查询语句后面加上了 lock in share mode 共享锁,此时是当前读操作。当然,当我们加排他锁的时候,也是当前读操作。
快照读
快照读 是什么
简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。
可配置参数
Read Committed:每次select,都生成一个快照读。
Repeatable Read(默认):开启事务后第一个select语句生成一个快照读,其结构是后续语句快照读的地方。
Serializable:快照读会退化为当前读
在测试中,我们看到即使事务B提交了数据,事务A中也查询不到。 原因就是因为普通的select是快照读,而在当前默认的RR隔离级别下,开启事务后第一个select语句才是快照读的地方,后面执行相同的select语句都是从快照中获取数据,可能不是当前的最新数据,这样也就保证了可重复读。
MVCC
全称 Multi-Version Concurrency Control,多版本并发控制
MVCC 是什么
指维护一个数据的多个版本,使得读写操作没有冲突
MVCC 实现原理
快照读为MySQL实现MVCC提供了一个非阻塞读功能。
需要依赖于数据库记录中的三个隐式字段、undo log日志、readView。
隐藏字段
隐藏字段 机制
当我们创建了上面的这张表,我们在查看表结构的时候,就可以显式的看到这三个字段。 实际上除了这三个字段以外,InnoDB还会自动的给我们添加三个隐藏字段
隐藏字段 含义分别是
是否添加最后一个字段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最终形成一条记录版本链表
版本链 机制——举例说明
准备 有一张表原始数据为
@DB_TRX_ID : 代表最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID,是自增的。
@DB_ROLL_PTR : 由于这条数据是才插入的,没有被更新过,所以该字段值为null。
然后,有四个并发事务同时在访问这张表
A. 第一步。如下
结果是 当事务2执行第一条修改语句时,会记录undo log日志,记录数据变更之前的样子; 然后更新记录,并且记录本次操作的事务ID以及回滚指针。如下
B.第二步
结果是 当事务3执行第一条修改语句时,也会记录undo log日志,记录数据变更之前的样子; 然后更新记录,并且记录本次操作的事务ID以及回滚指针。如下
readview
是什么&作用
(读视图)是 快照读 SQL 执行时,能够让MVCC提取对应数据的依据,记录并维护系统当前活跃的事务(未提交的)id。
ReadView 内容 四个字段
readview 作用是 规定了访问 版本链数据 的规则
@trx_id 代表当前undolog版本链对应事务ID
机制 不同的隔离级别,生成ReadView的时机不同
READ COMMITTED :在事务中每一次执行快照读时生成ReadView。
REPEATABLE READ:仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。
MVCC 机制
当RC隔离级别
举例说明
下面是根据事务生成的ReadView
下面是每次提交事务生成的版本链&第一次快照读的ReadView
在进行匹配时,会从取版本链中的第一个undo log事务id(就是trx_id)和 ReadView根据规则进行推导,从而得出结论,最后根据该结论操作。如果都不匹配则继续向下进行挨个匹配。
当RR隔离级别
与RC隔离级别 在根本上唯一不同的是生成RedView的机制。如下
知识回顾&小结
MVCC的实现原理就是通过 InnoDB表的隐藏字段、UndoLog 版本链、ReadView来实现的。
事务的隔离性通过 MVCC + 锁 实现
事务的一致性通过 redolog 与 undolog