MySQL数据库死锁的原因及解决方案

MySQL数据库死锁的原因及解决方案
死锁(死锁)

死锁是一种在执行过程中等待两个或多个过程的现象,这是由资源竞争引起的。如果没有外力的作用,他们将无法前进。此时,系统处于死锁状态或系统产生死锁,并且总是互相等待的过程称为死锁的过程。由于资源占用是相互排斥的,当一个进程申请资源,它使程序无法继续运行,没有外力的帮助,从而导致死锁的一个特殊的现象,在一个案例中,有在执行程序的永久性堵住两个或多个线程(等待)。每个线程都在等待被其他线程和被占用的资源。例如,如果线程锁定记录1等记录2,线程B锁记录2等待1的纪录,使两个线程死锁。在计算机系统中,如果系统的资源分配策略是不恰当的,它更可能是由程序员写的程序有错误,这将导致不正当竞争资源死锁的现象。有许多实现如锁,锁,共享互斥锁,锁表、树、时间戳协议等。锁有许多的粒度,如桌上的锁,或在记录锁。

造成僵局的原因主要是:

(1)系统资源不足。

(2)进程的进度顺序不合适。

(3)资源配置不当等。

如果系统资源充足,就可以满足进程的资源请求,死锁的可能性很低,否则将陷入死锁,争夺有限的资源。

死锁产生的四个必要条件

(1)互斥条件:资源只能一次使用一个进程。

(2)请求和保持条件:当进程被请求资源阻塞时,已获得的资源被保留起来。

(3)非剥夺条件:使用过程中获得的资源在使用结束前不得以武力剥夺。

(4)循环等待条件:若干进程形成头部和尾部之间的循环等待资源关系。

这四个条件是死锁的必要条件。只要死锁发生,这些条件就一定会成立,如果上述条件不满足,就不会发生死锁。

死锁的预防与解除

了解死锁的原因,尤其是四个必要条件,死锁,死锁是可以避免的,预防和消除。因此,如何避免在系统设计中的四个必要条件,进程调度等,以及如何确定资源的合理分配,从而避免永久占用系统资源的过程。此外,为了防止处于等待状态的资源状况的过程中,在系统的运行中,每个系统可满足动态检测使资源的过程,并根据检查结果来决定资源的分配,如果分配系统死锁的发生,也不会被分配,因此,或被分配。资源配置要合理规划。

如何最小化死锁
虽然不能完全避免死锁,死锁的数量可以减少。减少死锁的锁可以提高事务吞吐量和减少系统开销,因为只有很少的事务回滚,而回滚将取消执行的交易的所有工作。申请重新提交因为死锁回滚。

下面的方法有助于最小化死锁:

(1)以相同的顺序访问对象。

(2)避免事务中的用户交互。

(3)在批量过程中保持事务的短。

(4)使用低隔离级别。

(5)使用绑定连接

以相同的顺序访问对象

如果所有的事务都是以相同的顺序访问,死锁的可能性会降低。例如,如果两个并发事务获得锁的供应商表格然后在部分表得到锁,另一个事务被在供应商表前一交易完成。当第一个事务提交或滚回来,第二交易继续。没有死锁。存储过程用于所有数据的修改,能规范的访问对象的顺序。

避免事务中的用户交互

避免写作涉及的用户交互的事务,因为没有用户交互运行批处理用户查询的响应比手工快得多,如应用程序请求参数提示。例如,如果交易是等待用户输入,而用户去吃午餐或是周末回家,用户挂了这个交易使它不可能完成。这将降低系统的吞吐量,因为事务持有的所有锁被释放只有在事务提交或回滚。即使没有死锁,其他事务访问相同的资源将被阻塞,等待完成交易。

在批处理过程中保持事务的短

死锁通常发生在需要长时间运行的几个事务同时在同一数据库中执行时,事务越长,锁或更新锁的时间越长,从而阻塞其他活动,并可能导致死锁。

在批处理中维护事务可以最大限度地减少网络流量,从而减少事务完成和释放锁的可能延迟。

使用低隔离级别

决定交易是否可以运行在较低的隔离级别,提交读事务执行允许读取数据,其他事务已读取(未修改)无需等待要完成的第一笔交易。使用较低的隔离级别(例如,提交读)而不使用较高的隔离级别(例如串口读取),可以缩短持有共享锁的时间,从而减少锁争用。

使用绑定连接

使用绑定连接,打开到同一应用程序的两个或多个连接可以相互协作。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部