文章目录
1、表级锁介绍
表级锁,每次操作锁住整张表
。锁定粒度大,发生锁冲突的概率最高,并发度最低
。应用在MyISAM、InnoDB、BDB等存储引擎中
1.1、对于表级锁,主要分为以下三类:
表锁
(共享读锁、独占写锁)元数据锁
(meta data lock,MDL)意向锁
2、表锁
2.1、对于表锁,分为两类:
- 表
共享读锁
(read lock)- 表
独占写锁
(write lock)
2.2、共享读锁
左侧为客户端一,对指定表加了读锁,不会影响右侧客户端二的读,但是会阻塞
右侧客户端的写
。
2.2.1、创建表 score
create table score(
id int comment 'ID',
name varchar(20) comment '姓名',
math int comment '数学',
english int comment '英语',
chinese int comment '语文'
) comment '学员成绩表';
insert into score(id, name, math, english, chinese) VALUES (1, 'Tom', 67, 88, 95), (2, 'Rose' , 23, 66, 90),(3, 'Jack', 56, 98, 76);
2.3、独占写锁
左侧为客户端一,对指定表加了写锁,会阻塞右侧
客户端的读
和写
。
3、元数据锁
MDL加锁过程是系统自动控制
,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入
操作。为了避免DML与DDL冲突,保证读写的正确性
。
这里的元数据,大家可以简单理解为就是一张表的表结构。 也就是说,某一张表涉及到未提交的事务时,是不能够修改这张表的表结构的。
在MySQL5.5
中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享)
;当对表结构进行变更操作的时候,加MDL写锁(排他)
。
当执行SELECT
语句时,添加的是元数据共享锁(SHARED_READ
),会阻塞元数据排他锁(EXCLUSIVE
),之间是互斥
的。
3.1、查看数据库中的元数据锁的情况
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks ;
当执行SELECT
、INSERT、UPDATE
、DELETE等语句时,添加的是元数据共享锁(SHARED_READ
/
SHARED_WRITE
),之间是兼容
的。
4、意向锁
为了避免DML在执行时,加的
行锁
与表锁
的冲突
,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
4.1、假如没有意向锁
假如没有意向锁,客户端一
对表加了行锁
后,客户端二
如何给表加表锁呢,来通过示意图简单分析一下:
首先客户端一,开启一个事务,然后执行DML操作,在执行DML语句时,会对涉及到的行加行锁。
当客户端二
,想对这张表加表锁
时,会检查当前表是否有对应的行锁,如果没有,则添加表锁,此时就会从第一行数据,检查到最后一行数据,效率较低。
4.2、有了意向锁之后
客户端一,在执行DML操作时,会对涉及的行加行锁,同时也会对该表加上意向锁。
而其他客户端,在对这张表加表锁的时候,会根据该表上所加的意向锁来判定是否可以成功加表锁,而不用逐行判断行锁情况了。
4.3、查看意向锁及行锁的加锁情况
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
4.3.1、意向共享锁与表读锁是兼容的
4.3.2、意向排他锁与表读锁、写锁都是互斥的