面试库MySQL精准打击之间隙锁
时隔很久,又开始码字了,在最近这段时间将会给大家带来MySQL相关的面试知识点分享,从原理及面试考察点全面剖析、浓缩、提炼面试表达点。
前言
本次分享MySQL间隙锁及RR隔离级别情况下常见的加锁分析,那么废话不多讲直接撸起袖子干。什么是间隙锁
间隙锁
OK如上图所示,MySQL中的间隙锁(nextkeylock)由间隙锁(gaplock)和行锁(rowlock)组成。在使用过程中,会把查询范围的整个区间进行锁定,咱们可以先这样理解,后面慢慢剖析。为什么有间隙锁
在RR隔离级别下,则有可能出现幻读(强调新增,前后两次查询结果不一致)的情况。所以在MySQL中,加入了间隙锁对当前读下的幻读进行解决。为什么会出现幻读
我们来分析一下此时RC隔离级别b普通索引的加锁情况:
RC隔离级别下的幻读
可以看到RC隔离级别下,b5的记录加上了X锁,但是(0,5)还有(5,10)的间隙没有锁的情况,所以在这个间隙中可以插入新的数据。
现在我就可以回答出为什么会产生幻读了。产生幻读的原因是,行锁只能锁住行,但是新插入记录的这个动作,要更新的是记录之间的间隙。因此,为了解决幻读的问题,InnoDB在RR隔离级别引入了新的锁,它就是间隙锁(GapLock)。RC隔离级别下的加锁情况
下面进行测试表结构创建:createtabletest(idint(11)NOTNULL,aint(11)NOTNULL,bint(11)NOTNULL,cint(11)NOTNULL,PRIMARYKEY(id),UNIQUEKEYunixkey(a),KEYixkey(b))ENGINEInnoDB;insertintotestvalues(0,0,0,0),(5,5,5,5),(10,10,10,10),(20,20,20,20);
创建一张test表,id是主键,a是唯一索引,b是普通索引,c是没有索引。
现在假设是在RC隔离级别下,我们来做一个实验看看:
事务A
事务B
setsessiontransactionisolationREADCOMMITTED;
setsessiontransationisolationREADCOMMITTED;
begin;
selectfromtestwhereb5forupdate;
返回:(5,5,5,5)
begin;
insertintotestvalues(6,6,5,5);
commit;selectfromtestwhereb5forupdate;
返回:(5,5,5,5),(6,6,5,5)
commit;
由上面实验得出,在RC隔离级别下,事务A对b5这一行记录加了X锁,但是事务B插入一条新的记录的b字段也是为5,然后在事务A中可以查出b5有两条记录,这个就产生了幻读。
也就是说,幻读是指一个事务前后两次查询同一范围的时候,后一次查询看到了前一次查询没有看到的行记录。RR隔离级别下的加锁情况
加锁分析(以下默认都是RR隔离级别并且都是当前读)
这里我挑选出RR隔离级别下三种常见的情况进行SQL加锁分析:RR隔离级别,where字段没有索引RR隔离级别,where字段有普通索引RR隔离级别,where字段有唯一索引
(1)RR隔离级别无索引
RR隔离级别无索引
上图所示,GAP锁加在c字段的(负无穷,0),(0,5),(5,10),(10,20),(20,正无穷)。但是在RR隔离级别下,我们都是默认是用nextkeyLock(行锁间隙锁),所以我们都是默认是左开右闭,同时也得知了所有的记录都加上了X锁及GAP锁(可以理解成表锁)。因此这张表在执行该SQL期间并未commit的话,除了不加锁的快照读事务,其他任何加锁的操作都将堵塞,如果是线上环境,将会是件非常有意思的事。
总结一下:RR隔离级别下,无索引的条件字段的当前读不仅会把每条记录都加上X锁,还会加上GAP锁。
(2)RR隔离级别唯一索引
唯一索引的情况是最简单的,因为不管是RC隔离级别或者是RR隔离级别,唯一索引都只能查出一条记录,只会在对应的行记录加上X锁就没了。
为什么会这样?
因为GAP锁的目的是为了防止同一事务被连续两次当前读,然后两次读的情况不一致。如果能够保证字段是唯一的(唯一索引),其实就是最多只有一条记录满足条件,所以查询唯一索引的时候绝对不会出现GAP锁。
可以理解为RR唯一索引和RC唯一索引的加锁情况是一样的就好了。
(3)RR隔离级别普通索引
RR隔离级别普通索引
如上图所示,普通索引字段b10给两条记录加了X锁,并且把聚集索引树的两条记录也加了X锁。GAP锁的是b的范围(5,10),(10,正无穷)。所以nextkeyLock锁的是(5,10〕,(10,10〕,(10,正无穷〕。期间只要是b在nextkeyLock的范围内就更新全部阻塞。
举例:insertintotestvalues(6,6,6,6)就会被阻塞,原因就是RR隔离级别的间隙锁锁住了记录之间的间隙,所以会阻塞总结这次分享了RC隔离级别下出现幻读的情况,然后分析了为什么会出现幻读。InnoDB为了解决幻读,在RR下引入了GAP锁,和行锁组成nextkeyLock分析了三种常见情况的加锁情况操作。
孩子未被普高录取,家长一气之下,把3年参加过的补课班都举报了有些家长把全部希望寄托于补课班,认为学生进入补课班后,可以学到更多知识,成绩能够有很大提高,未来可以考上好高中和好大学。学生过度补课会有很多危害,有关部门一直在强调这个问题,也在严
谱写更加出彩的科普篇章本报讯(记者刘亚辉)8月3日,省政协副主席高体健带队到省科技馆新馆调研科普工作。高体健一行实地察看了四个常设展厅和一个短期展厅,详细了解科技馆布展和科普教育开展情况。座谈会上,省科
刘源周总理对我说,要当个好兵刘少奇之子刘源曾在周恩来第一百二十周年诞辰纪念日上,主动向外界分享过他和周总理的故事,周总理对他说要当个好兵!刘源谈起周恩来夫妇对自己一家多年来的照顾,对自己这些小辈的呵护时,至今
运油20现身,助歼20突破航程极限,成就空军战略标志根据我国空军宣布,现在我国军中新一代空中加油机运油20已经投入了实战化的训练之中,而且在这其中它还与我国的歼16战机开展了海上的空中加油训练,并且在这一训练当中所达到的训练成果体现
药明康德CXO行业基本面无忧,股价等待向上修复药明康德是国内CXO龙头企业,为全球生物医药行业提供一体化端到端的新药研发和生产服务,在亚洲欧洲北美等地均设有运营基地。行业上看,在科创兴国的宏观政策下,CXO行业的未来发展具有较
瘟神佩洛西上门,刚刚取消休假的尹锡悦抱歉,又想休假了休假还是不休假,对于韩国总统尹锡悦来说,是一个问题。不过当刚窜访过台湾的美国众议院议长佩洛西找上门,似乎一切问题都不是问题了。这假期,必须得休。据环球网报道,8月3日,当佩洛西即将
东部战区今天开始锁台军演,分析一下有哪些信息值得关注?最近,佩洛西与台当局狼狈为奸,将台海紧张局势推至新高。8月4日12时起,解放军宣布将在台湾岛周边海域和空域进行重要军事演训行动,并组织实弹射击。台湾有关军事部门称此举形同海空封锁台
环岛军演前,台媒称陆无人机首次掠过金门上空,台军做出危险射击4日早晨,台湾金门防卫指挥部发布新闻稿称,8月3日晚间有大陆无人机掠过金门北碇地区上空,台军驻守部队发射了信号弹示警驱离,并保持警戒实施隐蔽掩蔽。台军方发布此篇通报,明显是为了显示
称洛佩西老太婆错了吗?网民称窜访台湾的洛佩西为老太婆,有人迫不及待的跳出来反对,说称洛佩西老太婆很不礼貌,是对洛佩西的不尊重等等。老太婆三个字是贬义词吗?大家心里都有数,首先要想被别人尊重,就要学会尊重
站在人民的对立面,只会成为历史的罪人美国众议院议员佩洛西窜访台湾,让原本平缓的台海局势陡然变得剑拔弩张,将台湾同胞置身于水深火热之中的不是别人,正是台当局自己。此次台海事态的升级,作为民进党的代言人之一的萧美琴功不可
给你一张过去的CD,听听那时我们的爱情近处的海岸,遥远的星河,你是跨越山河的向往,是我眼中不灭的灯火。今天是七夕,想和你翻翻相片,听听歌,回忆那时嘉定人的爱情。上世纪90年代初,拍摄一套婚纱照是奢侈之举,更别提走出摄影