带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(2)https://developer.aliyun.com/article/1340033?groupCode=taobaotech
锁的类型分类
key代表二级索引,pk代表主键,截图二级索引一段数据,说明锁的分类。
记录锁(Record Locks)
- 记录锁是最简单的行锁,仅仅锁住一行。如:
SELECT id FROM t WHERE id=1 FOR UPDATE
- 记录锁永远都是加在索引上的,即使一个表没有索引,InnoDB也会隐式的创建一个索引,并使用这个索引实施记录锁。
- 会阻塞其他事务对其插入、更新、删除 ;;
间隙锁(Gap Locks)
- 间隙锁是一种加在两个索引之间的锁(众所周知索引是有序的),或者加在第一个索引之前,或最后一个索引之后的间隙。
- 使用间隙锁锁住的是一个区间,而不仅仅是这个区间中的每一条数据。
- 间隙锁只阻止其他事务插入到间隙中,他们不阻止其他事务在同一个间隙上获得间隙锁,所以 gap x lock 和gaps lock 有相同的作用。
Next-Key Locks
1. Next-key锁是记录锁和间隙锁的组合,它指的是加在某条记录以及这条记录前面间隙上的锁。
插入意向锁(Insert Intention)
顾明思义,该锁只会出现在insert操作执行前(并不是所有insert操作都会出现),目的是为了提高并发插入能力, 注意虽有意向二字,但插入意向锁是行锁。
- 插入意向锁是在插入一行记录操作之前设置的一种特殊的间隙锁,这个锁释放了一种插入方式的信号,亦即多个事务在相同的索引间隙插入时如果不是插入间隙中相同的位置就不需要互相等待。
普通的Gap Lock 不容许 在 (上一条记录,本记录) 范围内插入数据插入意向锁Gap Lock 容许 在 (上一条记录,本记录) 范围内插入数据
- 假设有索引值4、7,几个不同的事务准备插入5、6,每个锁都在获得插入行的独占锁之前用插入意向锁各自锁住了4、7之间的间隙,但是不阻塞对方不冲突的插入行。
锁类型兼容矩阵,横轴表示已持有的锁,纵轴表示尝试获取的锁。1表示成功(即兼容,表现为正常进行下一步操作),0表示失败(即冲突,表现为阻塞住当前操作):
兼容性 |
Gap |
Insert Intention |
Record |
Next-Key |
Gap |
1 |
1 |
1 |
1 |
Insert Intention |
0 |
1 |
1 |
0 |
Record |
1 |
1 |
0 |
0 |
Next-Key |
0 |
1 |
0 |
0 |
带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(4)https://developer.aliyun.com/article/1340030?groupCode=taobaotech