MySQL中的锁

全局级别锁

全局锁

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锁

相关文章
相关标签/搜索