范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

在MySQL中,用记录锁或者间隙锁在啥时候合适呢?

  在「读未提交」和「读已提交」隔离级别下,都只会使用记录锁,不会用间隙锁和 Next-Key 锁。而对于「可重复读」隔离级别来说,会使用记录锁、间隙锁和 Next-Key 锁。
  那么 MySQL 啥时候会用记录锁,啥时候会用间隙锁,啥时候又会用 Next-Key 锁呢?今天我们就来做一些测试,弄清楚这个问题。 影响因素
  在开始之前,我们需要声明的是:本文所有测试及结论的前提均是在「可重复读」隔离级别下,以及 Innodb 存储疫情下。
  根据网上资料,我们大概可以知道,影响其使用哪种行级锁的因素有: 索引类型(聚簇索引、唯一二级索引、普通二级索引) 匹配类型(精确匹配、唯一匹配、范围匹配) 事务隔离级别 是否开启 Innodb_locks_unsafe_for_binlog 系统变量 记录是否被标记删除 具体的执行语句类型(SELECT、INSERT、DELETE、UPDATE)
  为了让文章相对易懂一些,我准备重点测试索引类型与匹配类型两个影响因素。对于其他的影响因素,我将不做改动。例如:事务隔离级别固定为「可重复读」,Innodb_locks_unsafe_for_binlog 固定为 false。而第 5、6 点相对来说简单一些,则我们会简单带过。
  针对上面几个影响因素,我们指定了几个测试实验,分别是: 聚簇索引 + 精确匹配 聚簇索引 + 范围匹配 唯一二级索引 + 精确匹配 唯一二级索引 + 范围匹配 普通二级索引 + 精确匹配 普通二级索引 + 范围匹配 // 表结构 CREATE TABLE `test`.`price_test` (   `id` BIGINT(64) NOT NULL AUTO_INCREMENT,   `price` INT(4) NULL,   PRIMARY KEY (`id`)); // 表中数据 1, apple, 10 2, orange, 30 50, perl, 60聚簇索引 + 精确匹配
  为了测试「聚簇索引 + 精确匹配」下加锁的类型,我们采用如下的测试方法。
  事务 A 执行下面命令: begin; select * from price_test where id = 2 for update;
  执行  show engine innodb statusG;  查看锁信息如下图所示。
  可以看到,其是对 id 为 2 的索引加了一个记录锁。
  此时事务 B 执行下面命令: beign; update price_test set price = 25 where id = 2;
  执行之后,我们会发现事务 B 阻塞住了。
  那如果聚簇索引的值找不到对应的记录呢,将会是一个什么样的结果呢?
  我们再来测试一下,开始之前记得将事务 A 和 B 回滚恢复。
  事务 A 执行下面命令,其中 id 为 5 的记录是不存在的: begin; select * from price_test where id = 5 for update;
  执行  show engine innodb statusG;  查看锁信息如下图所示。
  可以看到,其加了一个间隙锁,该间隙锁应该是 (2, 50) 这个范围。
  我们可以通过在事务 B 执行如下命令来测试下间隙锁的范围。 beign; // 执行下面任何一个命令,可以通过 update price_test set price = 25 where id = 2; update price_test set price = 25 where id = 50; // 执行下面任何一个命令,都将阻塞 insert into price_test(id,name,price) values(3,"test",25); insert into price_test(id,name,price) values(5,"test",25); insert into price_test(id,name,price) values(49,"test",25);
  由此我们可以得出结论: 「聚簇索引 + 精确匹配」,如果能够定位到唯一一条存在的记录,那么其会使用记录锁。如果该记录不存在,那么则会使用间隙锁。 聚簇索引 + 范围匹配
  事务 A 执行下面命令: begin; select * from price_test where id >= 2 for update;
  执行  show engine innodb statusG;  查看锁信息如下图所示。
  可以看到,事务 A 一共加了 3 个锁,其中 1 个记录锁,2 个 Next-Key 锁。其中 1 个记录锁是对 id 为 2 的索引加的锁,Next-Key 锁是对 (2, 50] 和 (50, 正无穷) 这两个区间加的锁。
  在事务 B 执行下面命令可以验证间隙锁的加锁区间: beign; // 执行下面任意一条语句,都会阻塞 update price_test set price = 25 where id = 2; update price_test set price = 25 where id = 50; insert into price_test(id,name,price) values(5,"test",25); insert into price_test(id,name,price) values(60,"test",25);
  这里我们思考一下,如果范围匹配的值并不存在,那么会是什么情况呢?
  即事务 A 执行如下语句,其中 id 为 5 的记录是不存在的。 begin; select * from price_test where id >= 5 for update;
  执行  show engine innodb statusG;  查看锁信息如下图所示。
  可以看到,其实加了 2 个 Next-Key 锁,锁的范围应该是 (2, 50) 和 [50, + 无穷)。
  此时事务 B 执行下面命令,应该都会阻塞。 beign; // 执行下面任意一条语句,都会阻塞 update price_test set price = 25 where id = 50; insert into price_test(id,name,price) values(5,"test",25); insert into price_test(id,name,price) values(45,"test",25); insert into price_test(id,name,price) values(60,"test",25);
  由此我们可以得出结论: 「聚簇索引 + 范围匹配」,会使用「记录锁 + 间隙锁 + Next-Key 锁」。 唯一二级索引 + 精确匹配
  事务 A 执行下面命令: begin; select * from price_test where price = 10 for update;
  执行  show engine innodb statusG;  查看锁信息如下图所示。
  可以看到,其加的行级锁是 2 个记录锁,应该是 price = 10 这条索引记录的锁。
  此时,如果在事务 B 执行下面命令: beign; // 执行下面任意一条语句,都会阻塞 update price_test set name = "test-name" where price = 10;
  执行之后,我们会发现事务 B 阻塞住了。
  由此我们可以得出结论: 唯一二级索引与聚簇索引非常类似,都只有一个唯一值,都是使用记录锁。 唯一二级索引 + 范围匹配
  事务 A 执行下面命令: begin; select * from price_test where price >= 30 for update;
  执行  show engine innodb statusG;  查看锁信息如下图所示。
  可以看到,事务 A 一共有 5 个行锁,其中 3 个 Next-Key 锁, 2 个记录锁。大致可以猜测出两个记录锁分别是 price 为 30 和 60 的记录锁。3 个 Next-Key 锁则是 (10, 30)、(30,60)、(60, 正无穷)三个范围。
  为了验证我们上面的结论,我们在事务 B 执行下面命令,每条 SQL 都会阻塞住: beign; // 执行下面任意一条语句,都会阻塞 update price_test set name = "price30" where price = 30; update price_test set name = "price60" where price = 60; insert into price_test(id,name,price) values(5,"test", 20); insert into price_test(id,name,price) values(5,"test", 40); insert into price_test(id,name,price) values(5,"test", 70);
  执行之后,我们会发现事务 B 阻塞住了。
  由此我们可以得出结论: 「唯一二级索引 + 范围匹配」,会使用「记录锁 + 间隙锁 + Next-Key 锁」。 普通二级索引 + 精确匹配
  事务 A 执行下面命令: begin; select * from price_test where name = "apple" for update;
  执行  show engine innodb statusG;  查看锁信息如下图所示。
  可以看到,其不仅有一个记录锁,还有一个间隙锁。这里可以猜测记录锁是 apple 索引的记录锁,而间隙锁则是 (负无穷,orange) 的间隙锁。
  我们可在事务 B 执行如下命令验证一下: begin; // 执行下面任意一条语句,都会阻塞 update price_test set name = "apple-new" where name = "apple"; insert into price_test(id,name,price) values(5,"aa", 20); insert into price_test(id,name,price) values(5,"ha", 20); // 执行下面的语句正常执行 update price_test set name = "orange-new" where name = "orange"; insert into price_test(id,name,price) values(5,"orb", 20);
  之所以二级索引的精确匹配会有间隙锁,是因为二级索引可能匹配到多个。因此当匹配到一个的时候,会继续往后匹配,直到匹配到一个不符合的记录,随后就会以该不符合的记录(这里是 orange)作为值做一个间隙锁。
  由此我们可以得出结论: 「普通二级索引 + 精确匹配」,会使用「记录锁 + 间隙锁 + Next-Key 锁」。 普通二级索引 + 范围匹配
  事务 A 执行下面命令: begin; select * from price_test where name >= "orange" for update;
  执行  show engine innodb statusG;  查看锁信息如下图所示。
  从上图可以看到起一共有 2 个记录锁,3 个 Next-Key 锁。其中 2 个记录锁应该是 orange 和 perl 两个记录,3 个 Next-Key 锁,应该是 (apple, orange]、[orange, perl)、[perl, 正无穷)。
  我们可在事务 B 执行如下命令验证一下: begin; // 执行下面任意一条语句,都会阻塞 // 验证记录锁 update price_test set price = 1 where name = "orange"; update price_test set price = 1 where name = "perl"; // 验证间隙锁 insert into price_test(id,name,price) values(5,"ba", 20); insert into price_test(id,name,price) values(5,"orb", 20); insert into price_test(id,name,price) values(5,"pes", 20); // 执行下面的语句正常执行 update price_test set price = 1 where name = "apple"; insert into price_test(id,name,price) values(5,"aa", 20);
  可以看到「普通二级索引 + 范围匹配」与「普通二级索引 + 精确匹配」结果是类似的。
  我们可以得出结论: 「普通二级索引 + 范围匹配」,会使用「记录锁 + 间隙锁 + Next-Key 锁」。 总结
  我们做了这么多个测试,虽然有 3 种索引类型(聚簇索引、唯一二级索引、普通二级索引)和 2 种匹配类型(精确匹配、范围匹配),它们两两组合可以得出 6 种情况,再加上查询的值是否存在,可能有更多的可能性。 但是我们发现它们的结构都非常类似,基本上都跟查找的记录是否存在,以及查找的记录是否是唯一的相关。
  由此,我们大致可以得出结论: 如果查找的记录是唯一且存在的,那么只会使用记录锁,而不会使用间隙锁或 Next-Key 锁。 如果查找的记录不唯一或者不存在,那么就会使用 Next-Key 锁和间隙锁。
  通过这次测试,我们大概知道了加锁的一些原则,但实际上 Innodb 的关于加锁的源码还是比较复杂的。
  Original reprint:https://mp.weixin.qq.com/s/ucmIfX8Jc15CP1pqhzbuZg

人与人之间最大的差距,就在这4句话中对时间的态度强者惜时,弱者等待时间最公平,给任何人都是24小时时间也最偏私,你抛弃了时光,时光就会抛弃你。能否高效用时,是人与人之间的一道分水岭。要想缩短人与人之间的距离,就应该学十月小阳春,饮酒正当时凭君满酌酒,听我醉中吟农历十月,日色照拂着这晃晃悠悠的日子把大地映衬得清白透亮纵步闲逛,信步而行踏步向前迈进暖气蒸云,温润和煦这好似是临近冬天的小惊喜小阳春的阳光让人仿佛做了一个关好消息!执教经验丰富的洋帅将接手国足!明年1月份就会正式到位日前,国足选帅一直没有实质性进展,让很多球迷都觉得非常着急。因为,明年国足就要正式进入备战2026年世界杯的节奏。如果在此之前,足协还没有被国足选好新帅,那么国家队就面临群龙无首的华为何刚明年将发布鸿蒙HarmonyOS4IT之家11月4日消息,今日下午,华为开发者大会2022召开。会上,华为终端BG首席运营官何刚表示,华为明年将发布HarmonyOS4。IT之家了解到,2019年,HarmonyO距离很远心却很近若是足够真爱,距离算什么?若是真心了,爱就值了!若是在乎了,时间算什么?若是真的爱了,年龄又算什么?有人说距离真的会产生美吗?有很多回答,各有说法,各有感触,其中有一个高赞的回答如江苏人喝什么酒?这5款酒纯粮酿造,无法拒绝,行家好喝江苏,国内制造业大省,除了发达的经济,先进的理念,更让人津津乐道的是江苏十三太保,各个经济强地,反而让省会南京黯然失色。江苏更是以淮扬菜名扬天下,江苏人口味偏甜口,就有人好奇江苏人11月7日立冬,遵循老传统,别忘了吃立冬四宝,为入冬做准备11月7号即将迎来冬天的第一个节气立冬。立冬时节,民间有立冬补冬,补嘴空的习俗。冬季寒冷多病,也是人体抵抗力较弱的时候,自然需要补充营养补养身体,为过冬储存能量。立冬时节有讲究!有立冬时节养生应当讲究的那些事一要坚持早睡晚起。立冬以后,意味着冬天的开始,冬季草木凋零,蛰虫伏藏,万物活动趋向休止,以冬眠状态来养精蓄锐,为来年春天的生机勃发做准备。朋友们要早睡晚起,尽量不要熬夜。外出锻炼也老话说立冬一碗汤,不用郎中帮,给孩子喝这5道汤,助力成长秋日生活打卡季11月7号将迎来冬天的第一个节气立冬。立冬的到来表示着气温逐渐寒冷,阴天多雨,农作物开始进入休养收藏的阶段,同时是孩子补充营养的黄金期。俗话说春生夏长,秋收冬藏,立冬新生儿脐带如何护理?家长护理宝宝脐带时需注意脐带是连接宝宝和妈妈的通道,当宝宝在妈妈肚子里时是通过脐带来输送营养的,等宝宝出生后,脐带也就完成了它的使命。当脐带被剪断后,家长需要细心护理,防止护理不当造成脐带处细菌感染,引发双十一哪款洗碗机性价比高丨严选10余款高性价比洗碗机推荐给大家大家好,我是勇无止境,致力于科技带给人们幸福生活的勇无止境!今天要带给大家的就是一款智能家居的神器洗碗机,内含洗碗机的选购指南,以及本篇文章当中有10余款高性价比的洗碗机推荐给你!
省钱又省时,告诉你邮快递哪家便宜又快!邮快递哪家便宜又快?相信不少人都会遇到这个问题。其实快递公司之间的价格差异还是比较大的,有些快递公司的价格比较低,但是服务质量却不怎么样,所以大家在选择快递公司的时候一定要擦亮眼睛野火烧不尽里的野火为啥会玩儿命烧?南大科研团队有了新发现不少人对于野火的认知,多半来自古诗野火烧不尽。野火烧起来为啥会这么玩儿命?不要小瞧了野火的危害,它是全球重要自然灾害之一,科研工作者们在野火产生的原因应对等方面一直在不懈努力着。记谷歌员工谷歌已沦为普通大公司那种感觉已经消失了CNMO新闻作为美国科技巨头公司,谷歌在近期的日子并不好过。受多方面因素影响,谷歌CEO皮查伊在致员工信中确认将全球裁员约1。2万人,占员工总数逾6,是该公司有史以来规模最大的一轮过去的20年,产生了哪些汉语新词语?汉语新词语词典(20002020)侯敏编著一部多年本新词语词典。正文收录了2000年至2020年间产生的汉字开头的新词语4200余条,尤其关注人工智能信息处理生物医药等新兴科技领域关于LPA初步研究一RSP架构简介RSP(RemoteSIMProvisioning),指远程SIM配置。利用eUICCeSIM技术,移动用户可以在没有实体SIM卡的情况下,下载运营商配置文件并激活升级类消费需求加快释放新能源汽车销量增长93。4央视网消息国务院新闻办2月2日举行新闻发布会,商务部有关负责人介绍,2022年商务运行总体实现稳中有进。从消费市场看,2022年社会消费品零售总额达到44万亿元,与2021年基本持IDEA使用maven创建spring项目1。点击创建项目2。创建项目名3。添加maven的配置路径博主使用的是IDEA2021,支持的maven版本为3。6。3。(超过以上版本会报错)这里提一句,如果创建完成碰到以下这种地球的内核已经不转了?1936年,科学家在研究了地震产生的地震波穿过地球的过程后,发现了地球内核的存在。地震波的速度变化表明,在地球内部深处,存在一个主要由铁构成的固态中心,也就是内核。在内核之外,包裹热销到断货,口碑超iPhone14Pro!一加11成骁龙8Gen2明星机型最近一段时间,不仅各大手机厂商的新机不断官宣,连之前已经发布的骁龙8Gen2旗舰也有极高的热度和人气。近日一加11多个版本都卖到断货,供不应求,要知道在1月9日首销一加11仅用51IDM身份管理平台统一认证功能介绍数通畅联AEAIIDM统一身份管理平台实现5A管控,包括统一账户Account统一认证Authenticate统一权限Authority统一审计Audit应用管控AppContro扬州生态科技新城开局即冲刺12个重点项目签约落地最是一年春光好,发力奋进正当时。今天(2月2日),在扬州生态科技新城举行的2023春季招商攻势动员大会暨项目集中签约仪式上,12个项目正式签约落地。这次签约的12个项目涉及信息技术