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锁的主要内容,如果未能解决你的问题,请参考以下文章