表级锁,每次操作锁住整张表。锁定粒度大,发生所冲突的概率最高,并发度最低。应用在myisam、innodb、bdb等存储引擎中。
一、表级锁分类。
1、表锁
2、元数据锁(meta data lock,MDL)
3、意向锁
二、表锁。
分类
1、表共享读锁(read lock)
释放前
释放后
2、表独占写锁(write lock)
释放前
释放后
语法
1、加锁:lock tables 表名... read/write。
读锁,可以读,不可以写
写锁,本地客户端可以写可以读,其他客户端不能读不能写,释放后可以
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、共享锁,可以读可以写
2、修改表结构,未提交
3、提交后可更新表结构
4、查看元数据锁
select object_type,object_schema,object_name,lock_duration from performance_schema.metadata_locks;
查询
只有执行增删改查的时候,才会有对应的元数据锁,alter table改表结构的时候阻塞,提交事务即可执行。
四、意向锁。
为了避免DML在执行时,家的行锁与表锁的冲突,在innodb中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
1、演示。
没有意向锁
有意向锁
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,是为这一行加共享锁,为整张表家意向共享锁。
IS和读锁兼容,和写锁互斥,提交后释放
执行update语句,自动为这一行加行锁,为表加上意向排他锁
互斥,提交事务后即可释放
主要解决innodb引擎中加的行锁和表锁的冲突问题。