mysql图文展示Mysql锁

Posted 赵晓东-Nastu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql图文展示Mysql锁相关的知识,希望对你有一定的参考价值。

一、行锁和表锁的区别

锁定力度: 表锁>行锁
加锁效率: 表锁> 行锁
冲突概率: 表锁> 行锁
并发性能: 表锁<行锁

二、行锁:共享锁(Shared Locks)

共享锁,又称为读锁,简称S锁。
共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改;

加锁:

select * from student where id =1 LOCK IN SHARE MODE:

释放锁:事务结束

三、行锁:排他锁(Exclusion Locks)

排他锁又称为写锁,简称X锁。

排他锁不能与其他锁并存,如一个事务获取了一个数据行的排它锁,其他事务就不能再
获取该行的锁(共享锁、排他锁),只有该获取了排他锁的事务是可以对数据进行修改和读取。

加锁:
自动:delete/update/insert 默认加上X锁;
手动:select * from student where id =1 FOR UPDATE;
释放锁: 事务结束。

四、锁的作用

行锁到底锁住了什么?
是一行数据(Row)吗?
是一个字段(Column)吗?

建立表
t1,没有索引
在这里插入图片描述
在第一个事务里面将第一行数据进行锁住
在这里插入图片描述
在这里插入图片描述
发现id =3 的时候没有执行成功,整张表给锁住了。
在这里插入图片描述
新建一张表 是有主键id的
在这里插入图片描述
在这里插入图片描述
在一个表里面进行查询
在这里插入图片描述
发现不行
在这里插入图片描述
当我尝试id=4的时候,发现是可以的。
为什么加了主键的和不加主键的不一样。
在这里插入图片描述
然后我们创建一个唯一的索引
在这里插入图片描述
尝试锁一下这个字段
在这里插入图片描述
发现也不能成功
锁住的是行锁
InnoDB到底锁的是什么?
在这里插入图片描述
可以看出锁的是索引。
1、为什么一张表没有索引,加行锁会锁住整张表?
一张表有没有可能没有索引?
不可能,有聚集索引
没有命中索引 -> 全表扫描->把所有的隐藏的聚集索引全部锁住
在这里插入图片描述
如果锁住二级索引,它会把它的聚集索引也会锁住。

五、行锁的算法:锁住了什么范围?

在这里插入图片描述
在这里插入图片描述
记录有N个,那么间隙就有N+1个

记录锁(Record Lock):锁定记录

在这里插入图片描述

间隙锁(Gap Lock):锁定范围

在这里插入图片描述
s数据
1 4 7 10
在这里插入图片描述

临建锁(Next-key Lock) :锁定范围加记录

在这里插入图片描述
默认使用临建锁,没有任何一个索引记录会退化成间隙锁,如果查询条件为精确的话,会退化成记录索锁

以上是关于mysql图文展示Mysql锁的主要内容,如果未能解决你的问题,请参考以下文章

图文详解!mysql覆盖索引详解

分布式前修课:MySQL实现分布式锁

MySQL系列:kafka停止命令

硬核!管理mysql数据库的工具

大话MySQL锁

MySQL 事务与锁机制