mysql死锁案例调试与分析

最近在位面试做准备,突然看到有关死锁的案例,特此分析一下。

案例1:

表结构:

有一个是普通索引:

开始复现:


按照图上的顺序执行:

  1. 执行步骤1,此时获取Next-key Lock (E,W)
  2. 执行步骤2,此时获取Next-key Lock (E,W)
  3. 执行步骤3, 需要获取插入意向锁,等待步骤2 的Next-key Lock释放
  4. 执行步骤4, 需要获取插入意向锁,等待步骤1 的Next-key Lock释放

此时死锁出现,注意:Next-key Lock是不冲突的

SHOW ENGINE INNODB STATUS证明:

证明步骤1:


证明步骤2:


案例2:

表结构:

有一个是唯一索引:

开始复现:

按照图上的顺序执行:

  1. 执行步骤1,此时获取gap(10,20),需要获取插入意向锁
  2. 执行步骤2,此时获取gap(10,20),需要获取插入意向锁,等待步骤1 的gap
  3. 执行步骤3, 此时获取gap(10,20),需要获取插入意向锁,等待步骤2 的gap
  4. 注意:此时是不冲突的
  5. 执行步骤4, 回滚,此时就会变成,步骤3等待步骤2的gap,步骤2等待步骤3的gap,死锁

此时死锁出现,注意:Next-key Lock是不冲突的

SHOW ENGINE INNODB STATUS证明:

大致上跟案例1是一样的,很多时候,看完别人的文章,可以自己复现一下,最好再找一些能证明的日志,而不是单纯的看文章。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章