3.8 一个死锁的例子
文章插图
- sessionA启动事务后执行查询语句加lock in share mode,在索引c加next-key lock(5,10]和间隙锁(10,15);
- sessionB的update语句也要在索引c上加next-key lock(5,10],进入锁等待;
- 然后sessionA要再插入(8,8,8)这一行,被sessionB的间隙锁锁住 。由于出现了死锁,InnoDB让sessionB回滚;
就算分成了两步 , 为什么session B加(5,10)就能成功呢?session A不是加了(5, 10]的锁吗? 前面应该也是提到过的,间隙锁和间隙锁之间并不冲突,间隙锁和insert到这个间隙的语句才会冲突,因此session B加间隙锁(5, 10)是可以成功的 , 但是如果往(5, 10)里面插入的话会被阻塞 。但是如果直接加next-key lock(5, 10],那么肯定是会被阻塞的,因此这个例子确实说明,加锁的步骤是分两步的,先是间隙锁 , 后是行锁 。而且只要理解了间隙锁和行锁之间冲突的原则是不一样的,也就很容易理解这两个锁并不是一起加的了 。
推荐阅读
- Vue 微前端开发的七大神器
- .NET Core的中间件来对Web API进行流量限制实现方法
- MySQL时间存储终极指南:选择最适合你的时间类型!
- 梅花的嫁接时间,红梅杏嫁接时间
- 事业编制的教师,退休金的待遇和职称有关系吗?
- 萝卜疙瘩汤的做法
- 明星减肥前后差异有多大?减肥是最好的整容,有人完全认不出
- 佘诗曼新剧才是御姐和奶狗的正确打开方式?网友喊金莎来抄作业
- vivonex的屏幕发声到底怎么样
- 苜蓿的功效与作用,苜蓿的主要成分是什么?