【MYSQL】锁详解(全局锁、表级锁、行级锁)【快速理解】
目录
一、全局锁
二、表级锁
1.表锁
2.元数据锁
3.意向锁
三、行级锁
1. 行锁
2.间隙锁
3.临建锁
锁是处理并发情况下,对数据的一致性的关键因素,也是并发情况下对效率影响非常大的。
1、全局锁:锁定表中所有数据。
2、表级锁:锁定整张数据库表。
3、行级锁:对某行数据进行锁定。
一、全局锁
对数据库所有实例进行加锁,也就是整个数据库所有表进行加锁。一般在备份的时候,进行加全局锁,这样就会让备份的数据与当时数据库的数据一致,DML DDL操作无法访问只能DQL操作。
加全局锁的语法:flush tables with read lock;
解全局锁的语法:unlock tables;
优化备份
二、表级锁
1.表锁
使用的语法
加锁:lock tables 表名... read/write
解锁:unlock tables
1.表共享读锁
共享读锁就是只能进行读操作,不能进行写操作。
2.表共享写锁
共享写锁当前客户端可以进行读写操作,但是其他客户端不能进行读写操作。
2.元数据锁
是系统自动控制的,不需要显示使用,访问一张表的时候会进行自动加锁。避免DDL和DML冲突,保证读写的正确性。意思就是在表中开始事务的时候,不许对表的结构进行更改。
对数据更改的时候会加上一个排他锁,与其他锁是互斥的。元数据共享读锁和元数据共享写锁之间是兼容的。
3.意向锁
如果加表锁的时候,如果有行锁那么会出现冲突,所以再加表锁的时候每行进行检查是否有行级锁,但如果有意向锁,那么直接检查意向锁是否与表锁兼容,如果兼容直接加锁,如果不兼容就不允许加。
意向共享锁与表锁的共享锁(read)兼容,与表锁的排他锁(write)互斥;
意向排他锁与表锁的共享锁与排他锁都互斥。
意向锁直接不回互斥。
三、行级锁
1. 行锁
防止其他事务对此数据进行update和delete,RC(读已提交),RR(可重复读)事务情况都支持。
1.共享锁(S)
允许一个事务读一行,阻止其他事务获得相同数据集的排他锁。
2.排他锁(X)
允许数据更新,但是阻止其他事务获取相同数据集的排他锁和共享锁。
加锁方式,一般用索引进行加锁,如果没有索引那么行锁的加锁方式会升级成表锁!
2.间隙锁
只锁数据的间隙,而不锁数据本身,防止插入数据的时候产生幻读,在RR情况下支持。
索引上进行等值查询唯一索引,如果给不存的记录加锁时,优化为间隙锁,比如给两条记录中间的值加锁,此时给这个间隙加上了间隙锁。
如果使用的是非唯一索引,加锁进行等值匹配的时候会将该值的前后都加上间隙锁,因为非唯一索引插入可能会插入相同的值 在前后,为了避免这种情况就可以这样加间隙锁。
3.临建锁
是行锁和间隙锁的组合,在RR情况下支持。
在唯一索引下比如有个索引19,后面有一个25,我通过>19条件进行判断加锁,那么此时就会锁住19 25及19之间的还要25以后到正无穷的数据。