【MySQL】死锁案例之三

  
  ,,,,死锁,其实是一个很有意思,也很有挑战的技术问题,大概每个DBA和部分开发朋友都会在工作过程中遇见过。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助。
  <强>
  <强> 2.1插入锁机制
  在分析死锁案例之前,我们先学习一下背景知识插入语句的加锁策略。我们先来看看官方定义:
     

     

        

     

              

     

        

  
  

              

     

        

     

              

  
  

        

     

              

     

        

  
  

              

  
  

        

     

              

     

        

     

              

  
  

        

     

              

     

        

  
  

              

  
  

        

     

              
  <强> 3.3死锁日志
     
      <李>   
         李   <李>   最新检测到死锁
      李   <李>   
      李   <李>   20170917 151503 7 f78eac15700
      李   <李>   1交易
      李   <李>   事务462308661活跃6秒插入
      李   <李>   使用mysql表1锁定1
      李   <李>   360年代堆1行s undo日志条目1
      李   <李>   MySQL线程id 3796966 OS线程句柄0 x7f78ead9d700查询id 3796966 localhost根更新
      李   <李>   插入t7ida values3010
      李   <李>   1等待获准
      李   <李>   锁空间id 231页4 n位72指数ua的表t7 trx id 462308661模式年代等待
      李   <李>   2交易
      李   <李>   事务462308660活跃43秒插入线程内宣布InnoDB 5000
      李   <李>   使用mysql表1锁定1
      李   <李>   4堆1184 3行s undo日志条目2
      李   <李>   MySQL线程id 3796960 OS线程句柄0 x7f78eac15700查询id 3796960 localhost根更新
      李   <李>   插入t7ida values409
      李   <李>   2把(S
      李   <李>   锁空间id 231页4 n位72指数ua的表的t7 trx id 462308660 lock_mode X锁rec但差距
      李   <李>   2等待获准
      李   <李>   锁空间id 231页4 n位72指数ua的表的t7 trx id 462308660 lock_mode X锁差距rec之前插入意图等
      李   <李>   我们回滚事务1   李   
     日志分析
  我们从时间线维度分析:
  T2插入t7 (id)值(26岁,10)语句插入成功,持有X=10的行锁(X锁rec但不是差距)
  T1插入t7 (id)值(30、10),因为T2的第一条插入已经插入=10的记录,T1的插入一个=10则发生唯一约束冲突,需要申请对冲突的唯一索引加上S键锁(也即是锁定模式S等)这是一个间隙锁会申请锁住(4、10)(10、20)之间的差距区域。从这里会发现,即使是RC事务隔离级别,也同样会存在第二个关键锁锁,从而阻塞并发。
  T2插入t7 (id)值(40岁,9)该语句插入的=9的值在T1申请锁的差距(4、10)之间,故需T2的第二条插入语句要等待T1的S-Next-key锁锁释放,在日志中显示lock_mode X锁差距rec之前插入意图等
  
  <强>
  ,首先感谢登博和姜承尧两位德艺双馨的MySQL技术大牛对死锁技术知识的无私分享。本文案例和知识点一方面从官方文档获取,另一方面是根据两位大牛的分享整理,算是站在巨人的肩膀上的学习总结。在研究分析死锁案例的过程中,插入的意向锁和锁的差距这种类型的锁是比较难分析的,相信通过上面的分析总结大家能够学习到插入的锁机制,如何加锁,如何进行插入方面死锁分析。
  如果各位觉得阅读本文能够有所收获欢迎打赏一瓶饮料,
  【MySQL】死锁案例之三“> <h2 class=【MySQL】死锁案例之三