首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
数据库
›
Oracle
›
三、一文搞懂MySQL MVCC
返回列表
发新帖
三、一文搞懂MySQL MVCC
[复制链接]
发表于 2026-2-1 02:58:55
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
一、配景
1、事件
MySQL的 InnoDB引擎提供了事件,事件的四大特性:
①原子性:要么全部乐成,要么全部失败,假如事件中心有一个步调失败了,会回滚。
②划一性:也即数据划一性,一次事件事后,全部数据都应该是精确的,不存在加的没加,减的没减。
③隔离性:多个并发事件对数据举行修改时,不会相互影响,导致出现a的事件中的数据被b的事件修改的征象。
④长期性:事件竣事后,数据被永世生存,不会丢失。
InnoDB是怎样包管四大特性的:
①原子性通过undo log(回滚日记)包管 。
②隔离性通过MVCC和锁包管 。
③长期性通过redo log(重做日记)包管。
④划一性有原子性+隔离性+长期性包管。
2、并发环境下事件所引发的题目
在MySQL中,假如同时存在多个事件,大概会发生脏读、不可重复读和幻读的题目。
脏读:一个事件读到了另一个事件未提交的数据。比方a事件更新金额,之后b事件此时读取到a的金额,末了a事件回滚,b事件此时读到的就是逾期的数据,也就是脏数据。
不可重复读:一个事件多次读同一个数据(这里夸大同一个字段),前一次读的和后一次读的不一样。比方,a事件读取金额为100,然后b事件更新金额为200并提交了事件,之后a事件又读取金额,变为了200。不可重复读夸大的数据的值发生了厘革
幻读:一个事件多次读一个范围内的数目,前后两次的数目差异等。比方,a事件读取金额大于1万的用户数目为100个,然后b事件插入了20个金额大于1万的用户数,并提交了事件。之后a事件再次读取金额大于1万的用户数目,得到了120个。幻读夸大数据的前后读取到的数目差异等。
以上三种题目的严肃性排序为脏读>不可重复读>幻读
3、事件隔离级别
针对以上三种题目,SQL标准提出了四种隔离级别来规避这种征象。分别是
读未提交(RU,read uncomitted),指一个事件还没提交,他的修改就能被其他事件看到;
读已提交(RC,read committed),指一个事件提交后,他的修改才华被其他事件看到;
可重复读(RR,repeatable read),指一个事件实行过程中看到的数据始终是划一的;InnoDB默认
串行化(serializable),直接对记载加读写锁,假如发生读写,其他事件须要期待前一个事件完成。
以上四种隔离级别的隔离强度越高,
性能
越低,强度排序为串行化>可重复读>读已提交>读未提交。
在四种隔离级别下,能办理的题目范例也差异;
读未提交:全部题目都没办理。
读已提交:办理了脏读。
可重复读:办理了脏读,不可重复读。
串行化:全部题目都可以办理。
差异厂商对SQL标准的支持不一样,MySQL的innodb引擎默认下的可重复读没有完全办理幻读题目。而是通过MVCC+临键锁的方式来只管克制,但是在非常环境下还是没有办理的(着实在可重复读的环境下,假如事件在第一次读和第二次读的字段不是同一个,着实也没办理不可重复读的题目,这里只能看不可重复读的界说了,假如不可重复读指的是读同一个字段,那就办理了,假如前后读的不是类似字段,那还是没办理,反面会有例子。)
4、快照读和当前读
快照读:读取快照天生时的数据,快照是什么?在下面MVCC会讲到,平凡的select语句都是快照读。
当前读:读取当前最新的数据,select …for update、select… locki n share mode 、update是当前读。
5、innodb克制幻读的方式
针对快照读:通过MVCC,使用
版本
链快照的方式,每次快照读都是读取快照天生时的数据,这就使得前后读取的数据量是划一的。
针对当前读:通过临键锁(next-key lock)的方式,锁定临键锁所锁定的范围(详细什么范围可以看我的《mysql中的锁》文章),来克制其他事件对改范围内的数据举行插入修改的利用,从而使得前后数据量划一。
为了办理并发读写的环境下,为包管数据的划一性,须要加锁,但加锁又会影响读写服从,因此引入MVCC,通过维护一个数据的多
版本
链,使得读写没有辩说,从而进步并发下的读写服从。
二、MVCC
1、什么是MVCC?
MVCC全称多
版本
并发控制,它通过维护一个称为Read View(读视图)的数据,以及维护了在表中的两个隐蔽列来共同差异隔离级别下的事件中的快照读,从而克制读取到的数据出现脏读、不可重复读题目。
2、MVCC详细是怎样实现的?
这里只做简朴叙述,
起首读视图内界说了四个字段,他们告急记载了一系列的事件id,而每次在读视图天生时,就不可改变;
表中的两个隐蔽列分别记载了当前对改行举行修改的事件id,和一个指向上一个版本行数据的指针,每次修改完后,都会把上个版本信息在undo log日记中记载下来,而这列的指针则指向undo log日记中上个版本的信息,从而形成一条包罗全部修改记载的链表,即版本链。
MVCC通过读视图中的四个字段与隐蔽列中的事件id比对,包管了事件中的快照读利用读到的数据是版本链上自己事件开始时的数据,从而克制了读取到其他事件所修改的数据,进而克制了脏读、不可重复读的题目。
3、什么是快照?
快照是MVCC通过读视图、版本链所实现的在某一时候下的一份数据副本,这里的某一时候可以是事件开始时,大概是每次快照读、当前读开始时。
4、差异级别下的快照读
此中,要留意的是,在RC级别和RR级别下的快照读是不一样的(RU级别和串行化下不思量,由于没用到MVCC,RU都是当前读,串行化都是用锁)。
在RC中,事件开始时以及每次读取利用时(包罗快照读和当前读)都会天生一个快照副本,这个快照副本所获取到的数据都是已提交的数据,从而克制了脏读的发生。但是,由于每次读取都会天生新的快照,假如第一次读取和第二次读取之间其他事件提交了修改,就会导致第二次读取的数据和第一次差异等,从而引发不可重复读和幻读的题目。
在RR中,事件开始时会天生一次快照副本,之后的全部快照读都不会再天生新的快照副本,而是相沿第一次的快照副本,从而包管了事件的整个过程读取到的数据都是最开始那份,因此克制了不可重复读和幻读的题目。
5、差异级别下的当前读
在RC中,全部事件在举行当前读时都会上行锁,事件提交后开释锁,因此读取到的都是最新提交的数据,因此可以或许办理脏读的题目,但克制不了不可重复读和幻读。
在RR中,每次当前读都会加上临键锁,从而使得记载前后都不答应插入或修改,进而克制了不可重复读和幻读,
6、不可重复读和幻读在RR级别中出现的场景。
假如在一次快照读之后举行了当前读,在这之后的快照读都将读取最新天生的快照,而不是事件开始时的快照,假如不可重复读针对一条记载中的某个字段,那么RR级别下不会出现不可重复读,但假如是针对多个字段,那么在这种快照读->当前读->快照读的场景就会出现不可重复读。如图
同理,在快照读->当前读->快照读的场景下也会出现幻读。
三、总结
MVCC是Mysql的innoDB引擎的在RC和RR隔离级别下,针对快照读,为了克制多个事件在并发过程中,所出现的不可重复读和幻读的题目的一套办理方案,它通过一个称为读视图的数据布局以及在表中的两个隐蔽列,对多个事件之间的关系举行处理处罚,包管了一次事件过程中多次快照读得到的结果是划一的,从而在RC中克制了脏读,在RR中克制了不可重复读及幻读的题目。但是,假如在一次事件中多次快照读之间存在当前读,就会导致重新天生快照,从而仍旧会引发幻读的题目。
回复
使用道具
举报
返回列表
没腿的鸟
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表