MySQL中的锁

原创
2020/09/21 20:08
阅读数 115

全局级别锁

全局锁

MySQL的全局锁是通过FTWRL的方式加上的,完整语句为:Flush tables with read lock .

FTWRL操作会为数据库加全局读锁(FTWRL不是只有这一步操作),之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包

括建表、修改表结构等)和更新类事务的提交语句 。

表级别锁

表锁

MySQL的表锁加锁方式为:lock tables …read/write,从语句的语义上可以了解到,可以分别为表加读锁和写锁,解锁的方式为: unlock table。

注意:当你在A线程加了表锁之后,例如:lock tables t1 read, t2 write(为t1加读锁,t2加写锁),那么A线程可以操作的表只有t1、t2,且可以进行的操作

为:对t1读,对t2读写;总结一下:加锁的线程只可以操作加锁的表,且进行的操作要按照读写锁的规则来。

MDL锁 (metadata lock锁)

在MySQL 5.5版本中引入了MDL,当对一个表做增删改查操作的时候,加MDL读锁;当 要对表做结构变更操作的时候,加MDL写锁 ,MDL锁是自动加的。

行级别锁

MySQL的行锁是在引擎层由各个引擎自己实现的。MyISAM引擎不支持行锁,InnoDB引擎支持行锁,以下行锁均由InnoDB实现。行级锁是通过锁索引来实现的,否则退化为表级锁。

排他锁

UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X),也可以用for update显示加锁;排他锁与写锁规则一致。

共享锁

可用lock in share mode显示加锁,共享锁与读锁规则一致。

间隙锁

间隙锁是为了在可重复读级别下防止幻读,针对索引上的锁,锁的是查询的行的前后间隙,与写锁规则一致。

NEXT-KEY锁

间隙锁 && ( 共享锁 || 排他锁 ) = NEXT-KEY锁

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部