全局级别锁
全局锁
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锁