maxintcsdnblog 2019-01-08
在数据库中,死锁是两个或多个线程永远被阻塞(挂起),无限期地等待彼此的的条件来完成,解锁数据资源的情况。在这种情况下,任务都没有完成,也就永远处于等待状态下;因此它被认为是DBMS中最令人恐惧的并发症之一。下面我们来了解一下死锁发生的条件,已经如何预防死锁。
死锁发生的条件
如果满足以下所有条件,则可能发生死锁。
1、互斥条件:必须至少有一个资源一次不能被多个进程使用。
2、保持和等待条件:持有资源的进程可以请求系统中其他进程持有的其他资源。
3、无抢占条件:在未完成使用之前,不能强制从进程中获取资源。只有进程完成使用后才能释放它所持有的资源。
4、循环等待条件:一个进程正在等待第二个进程持有的资源而第二个进程正在等待第三个进程的情况......等等,最后一个进程正在等待第一个进程,从而制作一个循环链等待。
如何预防死锁
我们已经了解到,如果上述所有的条件都成立,则会发生死锁,因此阻止其中一个或多个可以防止死锁。
1、避免互斥条件:所有资源必须是可共享的,这意味着一次可以有多个进程获取资源。但这种方法几乎是不可能实现的。
2、避免保持和等待条件:如果进程在开始之前获取了所需的所有资源,则可以避免此条件。另一种避免此条件的方法是在流程持有时不执行请求资源的规则。
3、抢占资源:从进程中抢占资源可能导致回滚,因此需要避免这种情况以保持系统的一致性和稳定性。
4、避免循环等待条件:如果资源在层次结构中维护,并且进程可以按优先级递增顺序保存资源,则可以避免这种情况。这避免了循环等待。另一种方法是为每个进程规则强制一个资源 - 进程可以在释放当前由其保存的资源时请求资源。这避免了循环等待。
总结:以上就是本篇文章的全部内容,希望能对大家的学习有所帮助。
最近,公司现网的业务中出现上图所示的死锁异常,沿着问题分析,发现这个问题涉及很多数据库的基础知识。 <update id = "A" parameterType = "java.util.List"&