加锁的基本单位为next-key lock = 间隙锁+行锁 无论什么情况下,InnoDB 会往前扫描到第一个不满足条件的行为止。 数据准备# 其中,id 是主键索引(唯一索引),b 是普通索引(非唯一索引),a 是普通的列 唯一索引等值查询# 结论 当查询的记录是存在的,在用「唯一索引进行等值查询」时,next-key lock 会退化成「...
在非主键唯一索引范围查询时,如果是覆盖索引时,会对所有的后闭区间对应的主键,加行锁; 在非主键唯一索引加锁时,还是存在 next-key 锁住下一个区间的 bug。 普通索引 普通索引等值查询,因为不能确定唯一性,所以即使定位到记录,也是会向后查询,直到查询到不为该值的记录,从而锁定该值的区间; 普通索引的锁也是加...
1,Record Lock:单个行记录上的锁。 2,Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。GAP锁的目的,是为了防止同一事务的两次当前读,出现幻读的情况。 3,Next-Key Lock:1+2,锁定一个范围,并且锁定记录本身。对于行的查询,都是采用该方法,主要目的是解决幻读的问题。 测试一:默认RR隔离级别 root@localhost:...
临界<= 查询时,8.0.17 会锁住下一个 next-key 的前开后闭区间,而 8.0.18 及以后版本,修复了这个 bug。 3非主键唯一索引 非主键唯一索引等值查询,数据存在,for update 是会在主键加锁的,而 for share 只有在走覆盖索引的情况下,会仅在自己索引上加锁; 非主键索引等值查询,数据不存在,无论是否索引覆盖,相...