APP下载

一分钟告诉你:Mysql数据库死锁原因及解决、避免办法

消息来源:baojiabao.com 作者: 发布时间:2024-05-08

报价宝综合消息一分钟告诉你:Mysql数据库死锁原因及解决、避免办法

用数据库的时候,偶尔会出现死锁,针对我们的业务系统,出现死锁的直接结果就是系统卡顿、客户找事儿,所以我们也在想尽全力的消除掉数据库的死锁。下面就和小编一起看看死锁的条件和如何处理死锁吧。

死锁的条件

互斥条件(Mutual exclusion) :资源不能被共享,只能由一个程序使用。

请求与保持条件(Hold and wait):程序已获得了一些资源,但因请求其它资源被阻塞时,对已获得的资源保持不放。

不可抢占条件(No pre-emption) :有些系统资源是不可抢占的,当某个程序已获得这种资源后,系统不能强行收回,只能由程序使用完时自己释放。

循环等待条件(Circular wait) :若干个程序形成环形链,每个都占用对方申请的下一个资源。

处理死锁的策略

1、忽略该问题。例如鸵鸟算法。

2、检测死锁并且恢复。

3、仔细地对资源进行动态分配,以避免死锁。

4、通过破除死锁四个必要条件之一,来防止死锁产生。

鸵鸟算法:

该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。

银行家算法:

所谓银行家算法,是指在分配资源之前先看清楚,资源分配后是否会导致系统死锁。如果会死锁,则不分配,否则就分配。

按照银行家算法的思想,当程序请求资源时,系统将按如下原则分配系统资源:

(1) 当一个程序对资源的最大需求量不超过系统中的资源数时可以接纳该程序。

(2) 程序可以分期请求资源,当请求的总数不能超过最大需求量。

(3) 当系统现有的资源不能满足程序尚需资源数时,对程序的请求可以推迟分配,但总能使程序在有限的时间里得到资源。

(4) 当系统现有的资源能满足程序尚需资源数时,必须测试系统现存的资源能否满足该程序尚需的最大资源数,若能满足则按当前的申请量分配资源,否则也要推迟分配。

解决死锁的策略

对待死锁的策略主要有:

(1) 死锁预防:破坏导致死锁必要条件中的任意一个就可以预防死锁。例如,要求使用者申请资源时一次性申请所需要的全部资源,这就破坏了保持和等待条件;将资源分层,得到上一层资源后,才能够申请下一层资源,它破坏了环路等待条件。预防通常会降低系统的效率。

(2) 死锁避免:避免是指程序在每次申请资源时判断这些操作是否安全,例如,使用银行家算法。死锁避免算法的执行会增加系统的开销。

(3) 死锁检测:死锁预防和避免都是事前措施,而死锁的检测则是判断系统是否处于死锁状态,如果是,则执行死锁解除策略。

(4) 死锁解除:这是与死锁检测结合使用的,它使用的方式就是剥夺。即将某程序所拥有的资源强行收回,分配给其他的程序。

死锁的避免:

死锁的预防是通过破坏产生条件来阻止死锁的产生,但这种方法破坏了系统的并行性和并发性。

死锁产生的前三个条件是死锁产生的必要条件,也就是说要产生死锁必须具备的条件,而不是存在这3个条件就一定产生死锁,那么只要在逻辑上回避了第四个条件就可以避免死锁。

避免死锁采用的是允许前三个条件存在,但通过合理的资源分配算法来确保永远不会形成环形等待的封闭程序链,从而避免死锁。该方法支援多个程序的并行执行,为了避免死锁,系统动态的确定是否分配一个资源给请求的程序。方法如下:

1.如果一个程序的当前请求的资源会导致死锁,系统拒绝启动该程序;

2.如果一个资源的分配会导致下一步的死锁,系统就拒绝本次的分配;

显然要避免死锁,必须事先知道系统拥有的资源数量及其属性

总结:

遇到问题,不要猜!!!亲手复现下问题,然后再来分析。不要忽略上下文!!!理论知识再充足,关键时刻不一定想的起来!!!坑都是自己埋的!!!

2019-12-04 01:53:00

相关文章