表级锁,每次操作锁住整张表。锁定粒度大,发生所冲突的概率最高,并发度最低。应用在myisam、innodb、bdb等存储引擎中。

一、表级锁分类。

1、表锁

2、元数据锁(meta data lock,MDL)

3、意向锁

二、表锁。

分类

1、表共享读锁(read lock)

mysql ddl会锁表吗 mysql ddl 锁表_数据库

 释放前 

mysql ddl会锁表吗 mysql ddl 锁表_互斥_02

 释放后

 

mysql ddl会锁表吗 mysql ddl 锁表_mysql_03

2、表独占写锁(write lock)

mysql ddl会锁表吗 mysql ddl 锁表_数据库_04

释放前

mysql ddl会锁表吗 mysql ddl 锁表_mysql ddl会锁表吗_05

 释放后

mysql ddl会锁表吗 mysql ddl 锁表_意向锁_06

语法

1、加锁:lock tables 表名... read/write。

读锁,可以读,不可以写

mysql ddl会锁表吗 mysql ddl 锁表_mysql_07

写锁,本地客户端可以写可以读,其他客户端不能读不能写,释放后可以

 

mysql ddl会锁表吗 mysql ddl 锁表_数据库_04

2、释放锁:unlock tables 或者客户端断开连接。

三、元数据锁(meta data lock,MDL)。

MDL加锁过程是系统自动控制,无需显示使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DML与DDL冲突,保证读写的正确性。

 在mysql5.5中引入了MDL,当对一张表进行增删改查的时候,家MDL读锁(共享锁),当对表结构进行变更操作的时候,家MDL写锁(排他锁)。

                        

 

对应SQL

 

 

锁类型

 

 

说明

 

lock tables xxx read/write

shared_read_only/shared_no_read_write

select/select... lock in share mode

shared_read

与shared_read/shared_write兼容,与exclusive互斥

insert、update、delete、select... for update

shared_write

与shared_read/shared_write兼容,与exclusive互斥

alter table ...

与其他的MDL互斥

1、共享锁,可以读可以写

 

mysql ddl会锁表吗 mysql ddl 锁表_互斥_09

2、修改表结构,未提交

mysql ddl会锁表吗 mysql ddl 锁表_数据库_10

 3、提交后可更新表结构

mysql ddl会锁表吗 mysql ddl 锁表_数据库_11

4、查看元数据锁

select object_type,object_schema,object_name,lock_duration from performance_schema.metadata_locks;

 查询

mysql ddl会锁表吗 mysql ddl 锁表_mysql ddl会锁表吗_12

只有执行增删改查的时候,才会有对应的元数据锁,alter table改表结构的时候阻塞,提交事务即可执行。

mysql ddl会锁表吗 mysql ddl 锁表_意向锁_13

四、意向锁。

 为了避免DML在执行时,家的行锁与表锁的冲突,在innodb中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。

1、演示。

没有意向锁

mysql ddl会锁表吗 mysql ddl 锁表_数据库_14

 有意向锁

mysql ddl会锁表吗 mysql ddl 锁表_mysql_15

 2、分类。

意向共享锁(IS):由语句select ... lock in share mode添加。

意向排他锁(IX):由insert、update、delete、select ... for update添加。

3、兼容性。

意向共享锁(IS):与表锁共享锁(read)兼容,与表锁排他锁(write)互斥。

意向排他锁(IX):与表锁共享锁(read)和表锁排他锁(write)都互斥,意向锁之间不会互斥。

4、查看意向锁及行锁的加锁情况。

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

5、演示。

为这一行加行锁,为表加意向锁,查询语句后加上lock in share mode,是为这一行加共享锁,为整张表家意向共享锁。

mysql ddl会锁表吗 mysql ddl 锁表_mysql ddl会锁表吗_16

 IS和读锁兼容,和写锁互斥,提交后释放

mysql ddl会锁表吗 mysql ddl 锁表_mysql_17

 执行update语句,自动为这一行加行锁,为表加上意向排他锁

mysql ddl会锁表吗 mysql ddl 锁表_意向锁_18

mysql ddl会锁表吗 mysql ddl 锁表_数据库_19

 

互斥,提交事务后即可释放

mysql ddl会锁表吗 mysql ddl 锁表_mysql_20

 主要解决innodb引擎中加的行锁和表锁的冲突问题。