• mysql 4 死锁


    一 死锁是怎么被发现的?

    1.1 死锁成因&&检测方法

         左图那两辆车造成死锁了吗?不是!右图四辆车造成死锁了吗?是!

     图 死锁描述

    我们mysql用的存储引擎是innodb,从日志来看,innodb主动探知到死锁,并回滚了某一苦苦等待的事务。问题来了,innodb是怎么探知死锁的?

           直观方法是在两个事务相互等待时,当一个等待时间超过设置的某一阀值时,对其中一个事务进行回滚,另一个事务就能继续执行。这种方法简单有效,在innodb中,参数innodb_lock_wait_timeout用来设置锁等待超时时间,这是主动模式。

          仅用上述方法来检测死锁太过被动,innodb还提供了wait-for graph算法来主动进行死锁检测,每当加锁请求无法立即满足需要并进入等待时,wait-for graph算法都会被触发。

    1.2 wait-for graph原理

         我们怎么知道上图中四辆车是死锁的?他们相互等待对方的资源,而且形成环路!我们将每辆车看为一个节点,当节点1需要等待节点2的资源时,就生成一条有向边指向节点2,最后形成一个有向图。我们只要检测这个有向图是否出现环路即可,出现环路就是死锁!这就是wait-for graph算法。

       图 wait for graph

       innodb将各个事务看为一个个节点,资源就是各个事务占用的锁,当事务1需要等待事务2的锁时,就生成一条有向边从1指向2,最后行成一个有向图。

    二 死锁成因

    如前面所说,死锁一般是事务相互等待对方资源,最后形成环路造成的。下面简单讲下造成相互等待最后形成环路的例子。

    1不同表相同记录行锁冲突

     这种情况很好理解,事务A和事务B操作两张表,但出现循环等待锁情况。

    2相同表记录行锁冲突

    需要先总结好索引,才能玩转死锁

    https://www.cnblogs.com/LBSer/p/5183300.html

    todo

  • 相关阅读:
    golang包引用解析
    解决vs code中golang插件依赖安装失败问题
    设计模式之策略模式
    设计模式之模板方法
    设计模式——面向对象设计原则
    设计模式——个人浅谈
    Sublime Text3配置Lua运行环境
    Ntrip协议使用流程及服务器实现架构
    python3解析库lxml
    python3爬虫之Urllib库(二)
  • 原文地址:https://www.cnblogs.com/hup666/p/13374985.html
Copyright © 2020-2023  润新知