社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
三篇文章分别通过实际操作,介绍了主键、非主键唯一索引、普通索引、普通字段四个方面介绍了加锁的范围。
本篇文章再做一个总结。
- 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 |
这个单独介绍,是希望我理解的没有错误,如果大佬看到了,错误之处一定要帮忙指正出来。
8.0.17 版本是前开后闭,而 8.0.18 版本及以后,修改为了前开后开区间;
临界 <= 查询时,8.0.17 会锁住下一个 next-key 的前开后闭区间,而 8.0.18 及以后版本,修复了这个 bug。
普通索引等值查询,因为不能确定唯一性,所以即使定位到记录,也是会向后查询,直到查询到不为该值的记录,从而锁定该值的区间;
普通索引的锁也是加载该索引上的,如果涉及到存在的记录,会对该主键加行锁;
普通索引的范围查询,同样出现 next-key 查询下一个区间的 bug。
普通字段查询,会查询全表,这里锁的话就会锁住主键的所有区间。
通过实际操作,最大的感受就是不能眼高手低,看书也好,看文章也罢,一定要实际操作。
纸上得来终觉浅。
本文转载自微信公众号「程序员小航」,可以通过以下二维码关注。转载本文请联系程序员小航公众号。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!