捋了捋MySQL加锁相关东西,主要内容来自以下两篇文章,感兴趣同学可以自行翻阅:
MySQL 是怎么加锁的? | 小林coding
这里我就直接说自己的结论:
-
加锁的对象是索引,加锁的基本单位是 next-key lock,它是由记录锁和间隙锁组合而成的
-
next-key lock 是左闭右开区间,而间隙锁是左右全开区间。
-
具体怎么加锁得看select语句中的三个点
-
是不是唯一索引
-
是等值查询还是范围查询,亦或两者都有
-
要查询的记录是不是存在
-
-
加锁时候的规则:
-
查找过程中访问到的对象才会加锁。
-
唯一索引上的范围查询会上锁到不满足条件的第一个值为止。
-
唯一索引等值查询,并且记录存在,Next-Key Lock 退化为行锁。
-
非唯一索查询,结果存在,会对唯一索引和非唯一索引同时加锁
-
索引(唯一 + 非唯一)上的等值查询,会将距离最近的左边界和右边界作为锁定范围,如果索引不是唯一索引还会继续向右匹配,直到遇见第一个不满足条件的值,如果最后一个值不等于查询条件,Next-Key Lock 退化为间隙锁。
-