InnoDB 死锁检测实现

       InnoDB的死锁检测是通过等待图(Wait-For-Graph)的算法实现的,即检查所有在一个锁上等待的事务是否已经成环;如果成环了说明已经出现死锁,根据一定的策略将某个事务回退将环切断而解除死锁。   


死锁的检测时机是在将事务加入等待队列是检测的(lock_table_enqueue_waiting(表), lock_rec_enqueue_waiting(记录) );死锁检测函数lock_deadlock_occurs->lock_deadlock_recursive

  • 表锁
      由于一个表上的表锁是由双向链表来管理的,因此只要从当前锁向前遍历就可以遍历所有的锁(只需判断那些需要等待的事务的锁,如果不需要等待的,则跳过)。如果找到了事务和当前的相同的事务,说明事务已经成环了,说明死锁产生了。则根据事务的权重(这里是根据事务的undo_no[事务要更新或插入的行数] + 锁的数量来判断)来判断要回滚哪个事务。

  • 记录(行)锁
        由于记录锁是采用哈希来管理的,因此需要查找当前页所在哈希桶的所有锁,找到当前记录的所有的锁,并查看这些锁的事务是否成环,如果成环,则说明已经产生了死锁,根据事务的权重来判断回滚哪个事务。


  • 还有,由于死锁检测采用递归的方式检测的,如果递归层次超过LOCK_MAX_DEPTH_IN_DEADLOCK_CHECK(200)或搜索节点的个数超过LOCK_MAX_N_STEPS_IN_DEADLOCK_CHECK(1000000),则表示调用层次太深,或者调用次数过多,返回LOCK_EXCEED_MAX_DEPTH,也表示死锁产生了。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值