使用数据库时偶尔会出现死锁。对于我们的业务系统来说,死锁的直接结果就是系统卡住了,客户在找东西,所以我们在尽力消除数据库的死锁。让我们来看看僵局的条件以及如何处理与边肖的僵局。
僵局的条件互斥:资源不能共享,只能由一个进程使用。
保持和等待条件:当一个进程已经获得了一些资源,但是被请求其他资源阻塞时,它将保持获得的资源。
没有先占权:一些系统资源是不可先占的。某个进程获得了这样的资源后,系统不能强行收回,只能在用完时由进程自己释放。
循环等待条件:几个进程形成循环链,每个进程占用对方申请的下一个资源。
死锁处理策略
1.忽略这个问题。例如鸵鸟算法。
2.检测死锁并恢复。
3.小心地动态分配资源以避免死锁。
4.可以通过打破四个必要条件中的一个来防止死锁。
>。>。>。>。
鸵鸟算法:
该算法可以应用于死锁很少发生的情况。为什么叫鸵鸟算法?因为据说鸵鸟看到危险就把头埋在地下。可能鸵鸟看不到就不觉得有危险。有点像偷铃铛。
>。>。>。>。
银行家算法:
所谓庄家算法,就是在分配资源之前看清楚,资源的分配是否会导致系统死锁。如果发生死锁,则不分配,否则分配。
根据银行家算法,当一个进程请求资源时,系统将根据以下原则分配系统资源:
(1)当一个过程对资源的最大需求不超过系统中的资源数量时,该过程可以被接受。
(2)当请求总数不能超过最大需求时,流程可以分阶段请求资源。
(3)当系统现有资源无法满足流程所需的资源数量时,对流程的请求可以延迟,但流程总能在有限的时间内获得资源。
(4)当系统现有资源能够满足流程所需资源数量时,需要测试系统现有资源是否能够满足流程所需资源的最大数量,如果能够,则按照当前申请量进行资源分配,否则,延迟分配。
死锁解决策略处理死锁的策略主要包括:
(1)死锁预防:可以通过打破导致死锁的任何必要条件来预防死锁。比如要求用户在申请资源时一次性申请所有需要的资源,破坏了持有和等待条件;只有在前一层的资源获得之后,资源才能被应用于下一层资源,这破坏了循环的等待条件。预防通常会降低系统的效率。
(2)避免死锁:避免是指进程每次申请资源时都要判断这些操作是否安全,例如使用银行家算法。死锁避免算法的执行会增加系统的开销。
(3)死锁检测:死锁预防和避免是预措施,而死锁检测是判断系统是否处于死锁状态,如果是,执行死锁取消策略。
(4)死锁取消:这个和死锁检测结合使用,使用的方式是剥夺。也就是说,某个进程所拥有的资源被强制回收,分配给其他进程。
避免死锁:
死锁的防止是通过打破条件来防止死锁,但是这种方法破坏了系统的并行性和并发性。
死锁的前三个条件是死锁的必要条件,也就是死锁的必要条件,而不是这三个条件的存在,只要逻辑上避免第四个条件,就可以避免死锁。
为避免死锁,允许前三个条件存在,但采用合理的资源分配算法,保证永远不会形成循环等待的封闭进程链,从而避免死锁。此方法支持多个进程的并行执行。为了避免死锁,系统动态地确定是否为请求的进程分配资源。方法如下:
1.如果一个进程当前请求的资源会导致死锁,系统拒绝启动该进程;
2.如果一个资源的分配会导致下一步死锁,系统会拒绝这个分配;
显然,为了避免死锁,我们必须提前知道系统拥有的资源数量及其属性
总结: 遇到问题,不要猜!!!亲手复现下问题,然后再来分析。不要忽略上下文!!!理论知识再充足,关键时刻不一定想的起来!!!坑都是自己埋的!!!1.《死锁 一分钟告诉你:Mysql数据库死锁原因及解决、避免办法》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《死锁 一分钟告诉你:Mysql数据库死锁原因及解决、避免办法》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/tiyu/1557914.html