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

在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

留下还是扔掉?清理衣服精减衣橱的技巧分享关注我,实用攻略送上又到换季的时节,该整理一下自己的衣橱了!不知大家是否也曾经像我一样衣柜塞得满满的,但总是感觉没有适合的款?那么,我们来整理衣橱吧!把那些不会再穿的衣服通通扔掉!终于有个明白人了!韩国时尚教母我们的衣服都是从中国传过来的张明淑是韩国的时尚教母。她曾在韩国某综艺节目中说我们的王的礼服是从中国传过来的。所以中国的皇帝穿过的礼服是不能穿的。而明朝王子的衣服才是朝鲜王能穿的衣服。朝鲜王和明朝的王子是一个级第7金!齐广璞自由式滑雪空中技巧夺冠北京时间2月16日,北京冬奥会自由式滑雪男子空中技巧决赛结束,齐广璞夺得金牌。这也是中国代表团在本届冬奥会上获得的第7枚金牌。个人简介齐广璞,江苏徐州人,1990年10月20日出生中国代表团第7金!空中技巧决赛齐广璞夺金,贾宗洋无缘奖牌轮北京时间2月16日,北京冬奥会自由式滑雪空中技巧结束男子决赛争夺,中国选手齐广璞以129分夺得金牌,这是中国队在本届冬奥会第7金。乌克兰选手阿布拉缅科和俄罗斯奥委会选手布罗夫分获银米甸镇早春时节菜花香春日游早春时节米甸镇乡村田野的油菜花次第绽放一片片金黄的花海扮靓了春光阳光和煦微风轻拂沁人心脾的油菜花香和蜜蜂嗡嗡作响宛如一首交响乐金黄的油菜花海碧蓝的天空与近处的村庄远处的山峦交朝鲜观察,平壤街头女大学生的形象在朝鲜,大学数量最多的城市是平壤。平壤有十多所大学,大学生数量很多。走在平壤街头,经常能见到靓丽的女大学生。平壤女大学生,是街头一道靓丽的风景线。她们喜欢成群结队出现在街头,出行的男大学生拍下精致女同学,每次上课衣服不重样,网友看法不一大学是学生人生当中一段非常美妙的旅程,在这一阶段,学生没有了升学压力,拥有很多个人时间,可以尽情地发扬自己的个性。每个大学生的风格不同,在形形色色的大学生当中,有些大学生非常注重自早春的第一件薄外套!小个子照着这样穿,显高又气质最近我发现jjjsue(琇)更新了一大波薄外套穿搭,炒鸡有春天的氛围,看得我心花怒放,每一件都想入!!咱们小个子穿外套最怕啥?长度不合适显胖!压个子!而在欧尼这儿,压根不会出现这种同背万元包包,蒋欣清纯美cry,关晓彤气质最差,宋茜像挎菜篮大家平常都知道女星经常会撞衫,其实不单是衣服,鞋子包包这些她们也是经常会撞得,就像这款万元的绿色塑料包包,不知道怎么的就受到了这么多女星的宠爱,来看一下她们背上这个包包之后谁驾驭的家中资产过亿?李晓旭为何受人敬仰?这里有很多你所不知道的辽宁男篮,这支球队在CBA历史上绝对算得上是一支豪强,而在这支球队中也涌现出了大量的篮球名将,李晓勇郭士强等球员在辽篮的历史上都是占有着重要地位,近些年来,辽宁队也是呈现出了群星璀热议蒿俊闵讨薪就说吧,中超还能好吗?直播吧2月16日讯蒿俊闵发文讨薪,质问武汉足球俱乐部欠我的工资奖金什么时候给我?非要糊弄我!逼我!苗原蒿俊闵当时是自由身加盟武汉卓尔,山东泰山对这笔转会是一路绿灯相送,这也彰显了山
40岁以后T恤要少穿,不显气质,多穿这4件夏季衫,更优雅时髦中年女人,追求的已不是时尚,而是自成一派适合自己的气质,体现在穿衣打扮上,更需要突出一种高级和精致。夏季无疑是T恤泛滥的季节,看似具有无龄感风格又惬意的衣服,如果没有好的身材和搭配认识维生素B2,它对我们人体有什么作用呢?维生素是一类人体必需,但自身不能合成,必需从食物中摄取的小分子有机化合物。虽然不能像宏量营养素那样,为身体提供能量构成细胞,但是参与身体新陈代谢,缺乏会导致严重的健康问题。关于维生球场暴力何时休?中超联赛激战正酣,在刚刚过去的中超第八轮比赛中,裁判员的一些判罚引起了外界的热议,体坛新视野继续邀请资深国际级裁判王学智老师,就本轮中超赛场上出现的争议判罚,为大家一一进行分析和解百亿富豪朱树豪患癌坚持工作,带着氧气瓶看项目,去世留260亿要说到最受喜爱的体育运动,每个人的答案可能都不相同,但是,如果要是谈到最优雅的体育运动是什么,那么高尔夫一定是很多人心中的首选。新中国自成立以来,从百废待兴到国富民强,这其中少不了官宣!防守悍将加盟太阳,勇士被马刺截胡,篮网达成两笔冒险引援外媒MassLive带来一篇关于凯尔特人的最新报道,据知情人透露,在确定已经得到布罗格登的情况下,凯尔特人接下来使用交易特例的概率几乎为零,因为目前市面上找不到心仪的补强人选,再加7月刚开始,已有8位明星去世,最小23岁,有人独居离世无人知7月刚刚开始没多久,娱乐圈就陆续传出8位明星离世的消息,这8位明星中有人为文娱界做出过重大的贡献,有人正值青春年华,他们的离开对娱乐圈来说也是一大遗憾。1,朱俐静,40岁7月4日,谢娜终于走上高级的台阶,浪姐3中衣品飞升,款款惊艳又时髦你的衣着,能为你的气质锦上添花。高级感这词,在时尚界中,说白了其实就是一种气质,有时尚范儿的阐述。日常生活中,我们往往可以通过服饰造型去提升一个人的气质,对于作为主持人的谢娜也不例浪姐3五公淘汰2人,郑秀妍队3连败,王心凌成赢家,成团位9人文烤娱作为芒果扛把子级别的综艺,乘风破浪的姐姐来到第3季却遭遇滑铁卢。节目选曲编曲和服装造型槽点满满,公演舞台缺少亮点,最尴尬的观众投票一直为人诟病,野蔷薇梦中人佳人等优秀的舞台作情歌教父他是真称得上情歌教父的男人。人生太戏剧性,称得上命途多舛一生悲苦了。出道时叫小刚,也就是他小名。周传雄脍炙人口的歌包括但不限于黄昏寂寞沙洲冷关不上的窗我的心太乱男人海洋青花等等,还孟买女人即使出身低微,也要争取属于自己的尊严印度片孟买女人描述一个富家千金,受到男友欺骗而被卖到妓院,在经历各种劫难,看透社会底层生活之后,逐渐成为当地的黑道领袖,最后演变成女权斗士,向社会争取权利的传奇事迹,整部电影透过夸岁月神偷,还是带走了他此文为高能E蓓子原创,禁止任何形式的转载,转载请后台联系,但欢迎你们转发到朋友圈。昨天,传来倪匡去世的消息任何有倪匡的地方,就有有趣的故事当日娱乐圈还传来另一噩耗69岁著名导演编剧