作者回复: 嗯 所以我这里特别小心地没有写“锁“这个字。
间隙 (5,10)、(10,15)是客观存在的。
你提得也很对,“锁”是执行过程中才加的,是一个动态的概念。
这个问题也能够让大家更了解我们标题的意思,置顶了哈 👍
作者回复: 对, 好问题
lock_mode X waiting表示next-key lock;
lock_mode X locks rec but not gap是只有行锁;
还有一种 “locks gap before rec”,就是只有间隙锁;
作者回复: 1. 对的
2. 对的
3. “因为扫到了c=10,所以会加next-key lock (5,10]”, 对的。
第二个“如果”,实现上并不是这样的,所以没法回答😆
作者回复: 根据c>5查到的第一个记录是c=10,因此不会加(0,5]这个next-key lock。
你提醒得对,我应该多说明这句, 我加到文稿中啦👍
作者回复: select * from t where c>=15 and c<=20 order by c desc in share mode;
这个语句是根据 c=20 来查数据的,所以加锁(20,25]的时候,可以使用优化2;
select * from t where id>10 and id<=15 for update;
这里的id=20,是用“向右遍历”的方式得到的,没有优化,按照“以next-key lock”为加锁单位来执行
作者回复: 😆 👍
作者回复: 索引搜索就是 “找到第一个值,然后向左或向右遍历”,
order by desc 就是要用最大的值来找第一个;
order by就是要用做小的值来找第一个;
“所以只需要[20,25)来判断已经是最后一个20就可以了是吧”,
你描述的意思是对的,但是在MySQL里面不建议写这样的前闭后开区间哈,容易造成误解。
可以描述为:
“取第一个id=20后,向右遍历(25,25)这个间隙”^_^
作者回复: 1. 代码实现上,传入的就是id>10里面的这个10
2. 可以的,不过因为id是主键,而且id=15这一行存在,我觉得用优化1解释更好哦
作者回复: 会的
作者回复: 发现了👍🏿
作者回复: 练着练着,规则就忘记了,然后直接脑补执行流程,上结论
作者回复: 🤝🤝🤝🤝🤝
作者回复: 修改索引值都会修改位置的😆
作者回复: 赞
show engine innodb status 有惊喜😆
作者回复: 主要是这里这一行不存在。。
如果能够明确找到一行锁住的话,使用优化1就更准确些