全局级别锁
全局锁
MySQL的全局锁是经过FTWRL的方式加上的,完整语句为:Flush tables with read lock .数据库
FTWRL操做会为数据库加全局读锁(FTWRL不是只有这一步操做),以后其余线程的如下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包spa
括建表、修改表结构等)和更新类事务的提交语句 。线程
表级别锁
表锁
MySQL的表锁加锁方式为:lock tables …read/write,从语句的语义上能够了解到,能够分别为表加读锁和写锁,解锁的方式为: unlock table。索引
注意:当你在A线程加了表锁以后,例如:lock tables t1 read, t2 write(为t1加读锁,t2加写锁),那么A线程能够操做的表只有t一、t2,且能够进行的操做事务
为:对t1读,对t2读写;总结一下:加锁的线程只能够操做加锁的表,且进行的操做要按照读写锁的规则来。it
MDL锁 (metadata lock锁)
在MySQL 5.5版本中引入了MDL,当对一个表作增删改查操做的时候,加MDL读锁;当 要对表作结构变动操做的时候,加MDL写锁 ,MDL锁是自动加的。table
行级别锁
MySQL的行锁是在引擎层由各个引擎本身实现的。MyISAM引擎不支持行锁,InnoDB引擎支持行锁,如下行锁均由InnoDB实现。行级锁是经过锁索引来实现的,不然退化为表级锁。class
排他锁
UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X),也能够用for update显示加锁;排他锁与写锁规则一致。date
共享锁
可用lock in share mode显示加锁,共享锁与读锁规则一致。meta
间隙锁
间隙锁是为了在可重复读级别下防止幻读,针对索引上的锁,锁的是查询的行的先后间隙,与写锁规则一致。
NEXT-KEY锁
间隙锁 && ( 共享锁 || 排他锁 ) = NEXT-KEY锁