1、锁介绍
-- 范例表
create table mylock(
id int not null primary key auto_increment,
name varchar(20)
);
insert into mylock(id, name) values (1, 'a');
insert into mylock(id, name) values (2, 'b');
insert into mylock(id, name) values (3, 'c');
insert into mylock(id, name) values (4, 'd');
对于锁层面而言的两个概念:
- 读:代表的是对表数据的操作(INSERT、DELETE、UPDATE、SELECT)。
- 写:代表的是对表结构的操作(ALTER)。
2、锁分类
2.1、按锁粒度分类
- 全局锁:锁的是整个database,由MySQL的SQL Layer层实现,一般情况下不用。
- 表级锁:锁的是整个table,大多由MySQL的SQL Layer层实现,部分存储引擎也会实现表级锁,如InnoDB实现的意向锁就属于表级锁。
- 行级锁:锁的是某行数据,也可能锁定行之间的间隙。由存储引擎实现,如InnoDB。
- 页面锁:锁定粒度介于行级锁与表级锁之间,会出现死锁。各项性能介于表级锁、行级锁之间。使用页面锁的主要存储引擎是BerkeleyDB。
表级锁与行级锁之间的比较如下:
表级锁 | 行级锁 | |
---|---|---|
锁定目标 | 整个table | table中某行数据 |
实现者 | SQL Layer层 | SQL Layer层 / 存储引擎 |
开销 | 小 | 大 |
加锁速度 | 快 | 慢 |
是否会出现死锁 | 不会 | 会 |
锁定粒度 | 大 | 最小 |
发生锁冲突概率 | 最高 | 最低 |
并发度 | 低 | 最高 |
适用情景 | 查询为主、或只有少量按索引 条件更新数据。如Web应用。 |
有大量按索引条件并发更新少量 不同数据,同时又有并发查询的 应用,如一些在线事务处理(OLTP) |
主要适用引擎 | MyISAM,MEMORY,CSV等 | InnoDB |
2.2、按锁功能分类
- 共享读锁:共享读锁不会阻塞其他用户对同一张表对读请求,但会阻塞对同一张表对写请求。换言之,当一个SESSION获取到共享读锁后,并不妨碍其他SESSION读取锁定数据,然后却会阻止其他SESSION修改锁定数据,直到锁被释放。
- 排他写锁:排他写锁会同时阻塞其他用户对同一张表的读、写请求。换言之,当一个SESSION获取到排他写锁后,其他SESSION就不可以修改被锁定当数据,直到锁被释放。
2.3、按锁的实现方式分类
- 悲观锁:认为事务之间数据竞争几率是极低的,直到提交事务之前,才回去锁定。
- 乐观锁:先取锁再访问,为数据处理的安全提供了保证。
3、表级锁
表级锁由SQL Layer层实现。表级锁分为两种:表锁、元数据锁。查看表级锁的争用状态:
SHOW