MySQL优化--MVCC

news/2024/10/19 3:35:39/

目录

概念

MVCC的具体实现

隐式字段

undo log日志

概念

undo log版本链

readview


接上文,redo log保证了事务的持久性,undo log 保证了事务的原子性和一致性

那,隔离性是如何保证的呢?

锁:排他锁(如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁

mvcc : 多版本并发控制

概念

全称 Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突

mvcc最主要的功能就是在多个事务并发的情况下,确定应该并发的访问哪个版本

MVCC的具体实现

主要依赖于数据库记录中的隐式字段undo log日志readView

隐式字段

 

 我们在表中自定义了id,age,name字段,但其实内部还隐藏了三个mysql提供的字段

隐藏字段

含义

DB_TRX_ID

最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID

DB_ROLL_PTR

回滚指针,指向这条记录的上一个版本,用于配合undo log,指向上一个版本。

DB_ROW_ID

隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段。

undo log日志

概念

回滚日志,在insertupdatedelete的时候产生的便于数据回滚的日志

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

updatedelete的时候,产生的undo log日志不仅在回滚时需要,mvcc版本访问也需要,不会立即被删除

undo log版本链

假如此时同时有四个事务同时操作。

先来看事务2,此时会先把原来的数据记录到日志中

 事务3,此时会重新记录旧数据

 

事务4也是同理,综上所述,我们可以知道:不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。

但是,问题来了?事务5呢,事务5进行了两次查询,两次查询返回的内容一样吗?执行的结果一样吗?这个就不是undo log版本链可以决定的了,他只是做一个记录,具体的判断依据就是readview 

readview

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

当前读

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

快照读

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

而这个也与隔离级别有关

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

Repeatable Read:开启事务后第一个select语句才是快照读的地方。

四大核心字段:

字段

含义

m_ids

当前活跃的事务ID集合

min_trx_id

最小活跃事务ID

max_trx_id

预分配事务ID,当前最大事务ID+1(因为事务ID是自增的)

creator_trx_id

ReadView创建者的事务ID

 以图中标红位置为例,当执行到红框位置时,

m_ids就是事务3,事务4,事务5

min_trx_id就是事务3

max_trx_id就是事务6(预分配事务,最大事务+1

creator_trx_id就是事务5

其中,ReadView为了能获取快照读中最准确的数据,它定义了一些数据访问的规则

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

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

RC隔离级别下,在事务中每一次执行快照读时生成ReadView。

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

面试回答

面试官:事务中的隔离性是如何保证的呢?(你解释一下MVCC)

候选人:事务的隔离性是由锁和mvcc实现的。 其中mvcc的意思是多版本并发控制。指维护一个数据的多个版本,使得读写 操作没有冲突,它的底层实现主要是分为了三个部分,第一个是隐藏字段, 第二个是undo log日志,第三个是readView读视图。

隐藏字段是指:在mysql中给每个表都设置了隐藏字段,有一个是trx_id(事 务id),记录每一次操作的事务id,是自增的;另一个字段是roll_pointer(回 滚指针),指向上一个版本的事务版本记录地址

undo log主要的作用是记录回滚日志,存储老版本数据,在内部会形成一个 版本链,在多个事务并行操作某一行记录,记录不同事务修改数据的版本, 通过roll_pointer指针形成一个链表

readView解决的是一个事务查询选择版本的问题,在内部定义了一些匹配规 则和当前的一些事务id判断该访问那个版本的数据,不同的隔离级别快照读 是不一样的,最终的访问的结果不一样。如果是rc隔离级别,每一次执行快 照读时生成ReadView,如果是rr隔离级别仅在事务中第一次执行快照读时生 成ReadView,后续复用

 


http://www.ppmy.cn/news/477700.html

相关文章

PS-图层蒙版

PS-图层蒙版 抠图的基础方法-橡皮擦擦除法 缺点: 是在原图像上直接擦除不要的部分,会破坏原图像,操作不可逆,一旦操作失误,不能还原。 可逆的抠图方法:蒙版 蒙:遮盖起来 运用蒙版抠图的优点&…

PS学习-蒙版简介

蒙版简介:蒙版是用于调节图像修改程度以及进行局部调整的命令;蒙版只有三种颜色,黑色、白色、灰色;其中黑色代表保护,白色代表允许修改,灰色则用来调整被修改的程度。按住Alt键点击蒙版缩略图,可…

【PS】photoshop怎么添加层遮罩?

层遮罩其实就是:剪贴蒙版。 蒙版就是把上层的彩纸贴到下层的底板上,下层底板是什么形状,剪贴出来的效果就是什么形状的。方法如下: 1、打开PS,新建一个空白文档,输入一些文字。 2、在文字图层上面新建一个图…

PS利用蒙版把图片调暗

1.ctrlj将图片复制一层 2.在新图层按住alt添加黑色蒙版 3.调整色相/饱和度中的明度,将其拉低

2015年6月26日-ps图层蒙版

图层蒙版 图层蒙版是用来控制图层的显示范围的,常用于层与层之间的混合。 在贴之间先扣一个选区出来,然后选择编辑->选择性粘贴->贴入: 这样,新贴进去的图层是以蒙版的形式了。当然还可以直接图层->图层蒙版 ->显示…

ps如何创造图层蒙版

注意看红色圈,共有7个步骤,按顺序操作下去 点击矩形创造一个不带锁的颜色块 3.选择到刚刚创造的图层 4.然后点击下方的创造图层蒙版按钮 5.点击完图层蒙版之后然后点击图层上的那个图层蒙版 6.然后再点击画笔工具 7.然后就可以再图层蒙版内涂颜色&#…

ps蒙版与剪贴蒙版

蒙版概念:蒙版是控制所选图层的 显示 与 隐藏;“黑色”代表隐藏,“白色”代表显示;常用画笔工具和渐变工具操控。 剪贴蒙版:上层图层内容只能显示在下面图层有像素区域。 蒙版实现步骤:1复制两个图层&…

PhotoShop 之图层蒙版

分黑色蒙版和白色蒙版 使用效果不同: 黑色蒙版是表现“隐藏”当前图层的内容,是透明的,可以看到背景图层的内容. 透明 白色蒙版是表示“显示”当前图层的内容,使用黑色画笔涂抹可以显示出背景图层的样子。 不透明 总之记住一…