当前位置: 首页 > 科技观察

MySQLNext-KeyLock加锁范围总结

时间:2023-03-13 00:30:03 科技观察

三篇前言通过实际操作分别介绍了主键、非主键唯一索引、普通索引、普通字段四个方面的加锁范围。本文做一个总结。1data_locksselect*fromperformance_schema.data_locks;LOCK_MODELOCK_DATAlockrangeX,REC_NOT_GAP1515数据的行锁X,GAP1515数据前的间隙,不包括15X1515数据的间隙,包括15LOCK_MODE=X是前后开-关闭间隔;X,GAP为前开后开区间(gaplock);X,REC_NOT_GAP是行锁。单独介绍是希望自己的理解没有错误。看到了一定要帮忙改正。2当主键索引加锁时,会先给表加意向锁,IX或IS;如果有多个范围加锁,则分别加多把锁,每个范围有一把锁;(这个可以在id<20下练习)主键等效查询,当数据存在时,会在主键索引的值上加一个行锁X,REC_NOT_GAP;主键等效查询,当数据不存在时,会在查询条件的主键值所在的间隙上加一个间隙锁X,GAP;主键等值查询,范围查询时情况比较复杂:8.0.17版本是区间前后开启,8.0.18及以后版本修改为区间前后开启;critical<=query,8.0.17会锁定下一个next-key的前开后关范围,8.0.18及以后的版本修复了这个bug。3Non-primarykeyuniqueindexNon-primarykeyuniqueindex等效查询,如果数据存在,forupdate会锁住主键,forshare在使用覆盖索引时只会锁住自己的索引;non-primarykeyindex等价查询,数据不存在,不管索引是否被覆盖,都相当于一个范围查询,只是在非主键索引上加了一个锁,或者间隙锁,并在开盘前开盘区间;查询非主键唯一索引的范围时,当不是覆盖索引时,对应的范围会加上前开后闭的区间,如果有数据会加行锁对应的主键;查询非主键唯一索引的范围时,如果是覆盖索引,则所有在最后一个关闭区间对应的主键上加行锁;非主键唯一索引加锁时,仍然存在next-key加锁下一个区间的bug。4普通索引普通索引等价查询,因为无法确定唯一性,所以即使定位到记录,也会向后查询,直到查询到一条不是该值的记录,从而锁定该值的范围;普通索引的锁也是加载在索引上,如果涉及到已有记录,会在主键上加行锁;普通索引的范围查询也存在next-key查询下一个区间的bug。5普通字段普通字段查询会查询整个表。如果在这里锁定,主键的所有区间都会被锁定。6总结通过实际操作,最大的感受就是不能好高骛远,不管是看书还是看文章,都要实际操作。纸上谈兵总是肤浅的。本文转载自微信公众号“程序员小航”,可通过以下二维码关注。转载本文请联系程序员小航公众号。