mysql 死锁

死锁产生条件

  1. 互斥 (Mutual exclusion):资源不能被共享,只能由一个进程使用。
  2. 请求和保持(Hold and wait,部分分配,占有申请):已经得到资源的进程可以再次申请新的资源。
  3. 非抢占 (No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
  4. 环路等待 (Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。

处理死锁的策略

  1. 忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。
  2. 检测死锁并且恢复。
  3. 仔细地对资源进行动态分配,以避免死锁。
  4. 通过破除死锁四个必要条件之一,来防止死锁产生。
    1. 可以规定该资源获得顺序,如果请求的资源顺序与当前请求资源顺序不符合,则把当前持有的资源释放,再重新得到资源。
    2. 尝试定时的锁,使用每个显式Lock类中定时tryLock特性,来替代使用内部锁机制
    3. 在程序中尽量使用开放调用。依赖于开放调用的程序,相比于那些在持有锁的时候还调用外部方法的程序,更容易进行死锁自由度的分析。重新构建synchronized使开放调用更加安全。所谓开放调用是指调用的方法本身没有加锁,但是要以对方法操作的内容进行加锁。一句话,synchronized尽量不要锁定整个函数,而是把向锁的内容给锁了。
    4. 可抢占锁,也就是能够响应中断。

死锁解决方法

删除表的时候,突然发现数据表被锁住,于是想要查看一下MySQL的连接数
此前提是登录用户为root,如果是其他用户则只能查看到自己的连接。

mysql> show processlist ;

关闭用不到的连接Id mysql> kill 4;

则无关连接已经被杀死。 继续杀死Id为5的连接就ok。

  • qq_43638135
    妲己再美究为妃: 博主没有想过自己接一些私活干吗?我现在还没毕业,但是我也确实听说外挂市场自动化游戏脚本市场挺火热的,并且报酬也很丰厚,但是具体的我也不是很清楚,求解答。 (1个月前 #47楼) 查看回复(2) 举报 回复
    22