InnoDB 下行级别锁种类|学习笔记

简介: 快速学习 InnoDB 下行级别锁种类

开发者学堂课程【MySQL 实操课程InnoDB 下行级别锁种类】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/717/detail/12819


InnoDB 下行级别锁种类

 

内容简介

一、In no DB 下行级别锁种类

二、间隙

 

接下来学习第三部分的内容,ln no DB 下行锁的种类,一共提供了两种,分别是共享锁和排查锁,共享锁也叫读锁,排查锁也叫写锁。在执行查询语句或更新语句时,为了受影响的记录,施加行记锁的方法很简单。如何施加行记锁?第一种方式是施加共享锁,第二种方式是 for update,另外还有在执行一些更新时,会自动帮助增加排查锁。

 

一、In no DB 下行级别锁种类

1、行记录锁准备工作

(1)修改表结构,添加一列 score,并对score列进行赋值。

(2)确认当前事务的隔离级别为 MySQL 默认的可重复读 (repeatable read)

①举例图示:

图片1.png

图片2.png

演示:

在表中增加字段,执行“alter table user add score int(2)not null default0”,再查询此表,输入“select*from user”,详情如下图:

图片3.png

可以看到字段已经成功加入,这是准备工作。

2、行记录锁实战

(1)分别开启两个 MySQL 客户端 session1 和 session2,并确认事务隔离级别为repeatable read

(2)在 session1 中,表开启了事务后,更新 score 为90的记录

(3)在 session2 中更新 score 为80的记录发现也被阻塞,出现锁等待,直至超时。

①举例图示:

session1

图片4.png

session2

图片5.png

演示:

第一步:表已经增加过了,输入“select*from user”,“being”,先把值进行改写,因为 score 里面是没有数据的,更新下数据,输入“update user set score=70 where id=1”,id 为2的 score 值改为80,id 为3的 score 值改为90,在执行“select*from user”,详情如下:

图片6.png

里面便有了值,接下来执行“roll back”,“being”,再执行“update user set name=zhoubawhere score=90”,意思是把表中的 id3wangwu 改成 zhouba, 点击回车;在另一边也是如此,在第二页执行更改后的 score值也行不通,因为前面有锁表的操作,可以观察到所有的操作都未生效.

第二步:先添加索引,执行“create index idx- score on user(score)”语法,此时此索引创建成功,在执行“show indexes from user”,详情如下:

图片7.png

可以看到一个索引,目录为普通索引,再输入“being”,执行前面的操作,另一边也是如此,两边都执行“update user set name=zhoubawhere score=90”,直接被执行成功,因为两边都是执行的 score,如下图:

图片8.png

图片9.png

此图未成功执行的原因,score 数据在之前改之后进行了回滚,此处重新进行定义,导致锁未加上的原因,需要确定数据成功更改,接着吧 id 为1的 score 值改为70,id 为2的 score 值改为80,id 为3的值改为90,执行结果如下:

图片10.png

此时已经拥有了索引,为了重新演示,需要删除参数,表中无索引即可,在查询此表,输入“create index idx- score on user(score)”,点击回车,引进之后便有了索引。

再进行 update,执行 score 值为90的,可以看到并不能执行,因为已经被阻塞,此时返回查询值是否还存在,确认之后在加上索引,再确定“show indexes from user”表是否有索引,输入“being”,另一边同样的操作,然后添加 update 语句,另一边添加 update 语句会被阻塞,在阻塞的一边改值为80,便会成功执行。

可以发现索引在此环境下会生效,之前的操作相当于在 score 表上添加了列,加的是索引列。如果改动的值是“update user set name=zhoubawhere id=3”,不管是 id3 还是id2同样会被阻塞,主要是因为 was 条件后的字段需要添加索引;

写法“update user set name=zhoubawhere score=90and id=3”和“update user set name=zhoubawhere id=3 and score=90”同样被阻塞,演示发现“update user set name=zhoubawhere id=2and score=80”,可以执行。

第三步:在 was 查询条件后需添加索引和字段,加锁实际上是对索引加锁,如果不给索引加锁,便会使用默认的表记锁,这样会降低 ln no DB 表的并发性能,所以一定要加索引链。

 

二、间隙锁

1、在RR这个事务隔离级别,为了避免幻读现象,引入了 Gap lock。它只锁定行记录数据的范围,不包含记录本身,即不允许在此范围内插入任何数据

2、间隙锁的列所建立的索引必须为唯一索引

(1)演示:

首先需要创建间隙锁的索引,“create unique index ide x_ user_ score on user(score);begin”,在表中输入“roll back”,执行“drop index ide x_ user_ score on user”“show indexes on user”“show indexes from user”可以观察到无任何索引,接着创建一个唯一索引后输入“show indexes from user”查询,执行结果如下:

图片11.png

在输入“being”“select*from user where score<80look in share mode”,如图:

图片12.png

现在一共有三条记录,之后再在另一边执行“being”“insert into user (id, name,score)values (4,sunqi,95)”,输入“select*from user”进行查询,结果如下:

图片13.png

可以观察到已经成功插入,再插入一个值看执行结果,输入“being”“insert into user (id, name,score)values (5,wujiu,55)”,此时被阻塞到,因为前面进行了小于80的锁,小于80的是插不进的,大于等于80的才可以,大家把此锁成为间隙锁。

(2)不满足以上两个条件,再演示第三种看是否会被阻塞

在表中输入“set sessin transaction level read committed” “set sessin transaction isolation level read committed”“show variables like ‘tx-isolation’”,

图片14.png

一顿操作后,数据还未进入到表中,表中的数据还是原始数据,两边的操作基本相同,两边设置完之后,在重复演示,值在输入中一条一条加入,这种做法是完全失效的,所以只有事物是可重复读并是唯一索引时,才能成功插入。

本节课主要讲了三大板块,第一板块讲的 MySQL 下不同存储引擎下的不同形式讲了 MySQL 引擎和 ln no DB 引擎,MySQL 需要手动加锁,包括读锁和写锁,加锁之后去执行其他未加锁的表,当前客户端会报出错误;第二板块讲的 ln no DB 下锁的类型,读锁和写锁也演示过了;第三板块讲的 ln no DB 下行级锁的种类,也讲了 ln no DB 下行锁的要求,需要加索引,并包括讲的元数据锁、MDL,这节课到此结束。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
存储 人工智能 关系型数据库
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.3-InnoDB中的锁
【MySQL技术内幕】6.3-InnoDB中的锁
348 57
|
监控 关系型数据库 MySQL
在Linux中,mysql的innodb如何定位锁问题?
在Linux中,mysql的innodb如何定位锁问题?
|
SQL 存储 关系型数据库
"MySQL增列必锁表?揭秘InnoDB在线DDL,让你的数据库操作飞一般,性能无忧!"
【8月更文挑战第11天】在数据库领域,MySQL凭借其稳定高效的表现深受开发者喜爱。对于是否会在给数据表添加列时锁表的问题,MySQL的行为受版本、存储引擎等因素影响。从5.6版起,InnoDB支持在线DDL,可在改动表结构时保持表的可访问性,避免长时间锁表。而MyISAM等则需锁表完成操作。例如,在使用InnoDB的表上运行`ALTER TABLE users ADD COLUMN email VARCHAR(255);`时,通常不会完全锁表。虽然在线DDL提高了灵活性,但复杂操作或大表变更仍可能暂时影响性能。因此,进行结构变更前应评估其影响并择机执行。
294 6
|
SQL 关系型数据库 BI
关于InnoDB行锁和4种锁是怎么实现的?
总的来说,InnoDB的行锁机制通过索引来实现对数据行的精确控制,并通过多种锁类型和兼容性规则来处理并发事务中的冲突。开发者需要注意合理使用索引和优化事务处理,以提高数据库的并发性能和稳定性。
224 1
|
存储 SQL 算法
Innodb锁机制:Next-Key Lock 浅谈
Innodb锁机制:Next-Key Lock 浅谈
436 0
|
存储 算法 关系型数据库
MySQL相关(八)- innodb行级锁深入剖析
MySQL相关(八)- innodb行级锁深入剖析
263 0
|
存储 算法 关系型数据库
MySQL相关(七)- innodb 锁的介绍及使用
MySQL相关(七)- innodb 锁的介绍及使用
126 0
|
存储 监控 关系型数据库
InnoDB中的各种锁及其应用
InnoDB中的各种锁及其应用
|
存储 关系型数据库
java202303java学习笔记第四十三天函数-存储引擎-innoDB介绍1
java202303java学习笔记第四十三天函数-存储引擎-innoDB介绍1
85 0