作者回复: 1. 是的
2. 这个我觉得是为了防止这个记录再被删除(不过这个理由不是很硬,我还没有找到其他解释
3. 互斥的,所以这两个语句都在等待。注意next-key lock是由间隙锁和记录锁组成的哦, 间隙锁加成功了的。好问题。
4. 还没有提交,但是这个记录已经作为最新记录写进去了,复习一下08篇哈
作者回复: 对
作者回复: 可重复读隔离级别下,事务是可以看到自己刚刚修改的数据的 ,好问题
作者回复: 👍,这两点都是很有用的建议
作者回复: 👍
作者回复: 额,
这里我们要澄清一下哈
只有一个gap lock,就是 next key lock = gap lock + record lock;
我们说一个insert语句如果要插入一个间隙,而这个间隙上有gap lock的话,insert语句会被堵住,这个被堵住的效果,实现机制上是用插入意向锁和gap lock相互作用来实现的。
gap lock并不属于插入意向锁的一部分 ,就没有“插入意向锁的gal lock”这个概念哈
作者回复: 这就是压力太大了。。 一般伴随着ioutil很大,语句执行特别慢,别的语句就被堵着等锁,等超时就自己crash
作者回复: “那这里的session B应该是加了个(22,25]的next-key lock,并没有因为是唯一键退化成记录锁” 由于insert主键冲突导致的锁,是不会退化的。
session B 加了next-key lock,
这样session C插入也要等待,然后等session B超时,释放了这个next-key lock,session C就可以执行了。
跟我们文中说的是一致的哦。
你这个验证挺合理的呀,
不会有因为“间隙非常小,所以将他当成记录锁”这种逻辑哈, a和a+1之间也是有间隙的😆。
不过这个是个好的实验和好问题👍
作者回复: 不是,发现冲突直接加的就是写锁
作者回复: 1. 你说得对,👍细致,发起勘误了哈
2. 图7 这里说的唯一键冲突,就是发现“已经有一个c=5的行存在”,所以转为加next-key lock,没有单独的加行锁的逻辑哈
作者回复: 看来是的了,
👍,很好的验证,我加到明天文章末尾说明
作者回复: 好问题
这种情况下一般是造成锁等待,不会造成死锁吧 😆
作者回复: 要看需求,不过因为表情用的很多了,utf8mb4很常用了
作者回复: session A的select语句没有加 for update 或者 lock in share mode ?
作者回复: 这个取决于业务需求,如果是明确会存在这样的情况,并且可以忽略,是可以这么用的
作者回复: 是这样的,gap lock是无所谓S还是X的。
但是record lock 有。
Gap lock + 排他的record 就称作 排他的next-key lock 吧😄