msyql 锁的分类

发布时间 2023-05-05 21:32:52作者: 深海11

1. 以锁的粒度维度划分:

1.1 表锁

1.1.1 全局锁:加上全局锁之后,整个数据库只能允许读,不允许做任何写操作。

1.1.2 元数据锁/MDL锁:基于表的元数据加锁,加锁后整张表不允许其他事务操作。

1.1.3 意向锁:是InnoDB为了支持多粒度的锁,为了兼容行锁、表锁设计的,如给一条数据加了行锁,此时要加表锁,为了方便判断,在加行锁时设置了表级别的意向锁,加快判断速度。

1.1.4 自增锁/AUTO-INC锁:为了提升自增ID的并发插入性能而设计的

1.2 页面锁

1.3 行锁

1.3.1 记录锁/record锁:也就是行锁,一条记录和一行数据是同一个意思。

1.3.2 间隙锁/Gap锁:InnoDB 中解决幻读问题的一种锁机制。

1.3.3 临建锁/Next-Key锁:间隙锁的升级版,同时具备记录锁+间隙锁的功能。

2. 以互斥性的维度划分:

2.1 共享锁/s锁:不同事务之间不会相互排斥、可以同时获取的锁。

2.2 排他锁/x锁:不同事务之间会相互排斥、同时只能允许一个事务获取的锁。

2.3 共享排他锁/SX锁:MySQL 5.7中新引入的锁,主要解决SMO带来的问题。

3. 以操作类型的维度划分:

3.1 读锁:查询数据时使用的锁

3.2 写锁:执行插入、删除、修改、DDL语句时使用的锁。

4. 以加锁方式的维度划分:

4.1 显示锁:编写SQL语句时,手动指定加锁的粒度。

4.2 隐式锁:执行SQL语句时,根据隔离级别自动为SQL操作加锁。

5. 以思想的维度划分:

5.1 乐观锁:每次执行前认为自己会成功,因此先尝试执行,失败时再获取锁。

5.2 悲观锁:每次执行前都认为自己无法成功,因此会先获取锁,然后再执行。