以下均针对可重复读级别下的锁规则。
原则 1:加锁的基本单位是 next-key lock(间隙锁+行锁)。next-key lock 是前开后闭区间。
原则 2:查找过程中访问到的对象才会加锁。
优化 1:索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁。
优化 2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock 退化为间隙锁。
一个 bug:唯一索引上的范围查询会访问到不满足条件的第一个值为止。(现已修复)
又可以归纳为:
- 查找过程中访问到的对象才会加锁,加锁的基本单位是
next-key lock(前开后闭的区间)。 - 等值查询:唯一索引会优化成行锁;非唯一索引会向右遍历时且最后一个值不满足等值条件的时候,next-key lock 退化为间隙锁。
- 范围查询:无论是否是唯一索引,范围查询都需要访问到不满足条件的第一个值为止。
同时要注意lock in share mode(共享锁,读锁)与for update(独占锁,写锁)的区别。
共享锁:只会加在对应的索引上。
独占锁:对应的索引上,和对应的主键索引上。
