三篇文章分别通过实际操作,介绍了主键、非主键唯一索引、普通索引、普通字段四个方面介绍了加锁的范围。
本篇文章再做一个总结。
select * from performance_schema.data_locks;
LOCK_MODE | LOCK_DATA | 锁范围 |
---|---|---|
X,REC_NOT_GAP | 15 | 15 那条数据的行锁 |
X,GAP | 15 | 15 那条数据之前的间隙,不包含 15 |
X | 15 | 15 那条数据的间隙,包含 15 |
LOCK_MODE = X
是前开后闭区间;X,GAP
是前开后开区间(间隙锁);X,REC_NOT_GAP
行锁。这个单独介绍,是希望我理解的没有错误,如果大佬看到了,错误之处一定要帮忙指正出来。
X,REC_NOT_GAP
;X,GAP
;前开后开
区间;<=
查询时,8.0.17 会锁住下一个 next-key 的前开后闭区间,而 8.0.18 及以后版本,修复了这个 bug。普通字段查询,会查询全表,这里锁的话就会锁住主键的所有区间。
通过实际操作,最大的感受就是不能眼高手低,看书也好,看文章也罢,一定要实际操作。
纸上得来终觉浅。
- <End /> -