📜  DBMS中的DBMS死锁

📅  最后修改于: 2020-12-12 07:44:23             🧑  作者: Mango

DBMS中的死锁

死锁是指两个或多个事务无限期地等待对方放弃锁的情况。死锁被认为是DBMS中最令人担忧的并发症之一,因为没有任务完成并且永远处于等待状态。

例如:在学生表中,事务T1在某些行上持有锁,并且需要更新成绩表中的某些行。同时,事务T2在成绩表中的某些行上保持锁定,并且需要更新事务T1所持有的Student表中的行。

现在,出现了主要问题。现在,事务T1正在等待T2释放其锁定,并且类似地,事务T2正在等待T1释放其锁定。所有活动都停止并处于停顿状态。在DBMS检测到死锁并中止其中一个事务之前,它将保持静止状态。

避免死锁

  • 当数据库处于死锁状态时,最好避免使用数据库,而不要中止或恢复数据库。这是浪费时间和资源。
  • 死锁避免机制用于提前检测任何死锁情况。诸如“等待图形”之类的方法用于检测死锁情况,但是此方法仅适用于较小的数据库。对于较大的数据库,可以使用防死锁方法。

死锁检测

在数据库中,当事务无限期地等待获取锁时,DBMS应该检测该事务是否涉及死锁。锁管理器维护“等待”图以检测数据库中的死锁周期。

等待图

  • 这是用于死锁检测的合适方法。在这种方法中,将基于事务及其锁定来创建图。如果创建的图形具有循环或闭环,则存在死锁。
  • 系统为每个正在等待其他事务持有的某些数据的事务维护等待图形。系统会继续检查图形,如果图形中有任何循环。

等待上述情况的图表如下所示:

防止死锁

  • 防止死锁的方法适用于大型数据库。如果以永不发生死锁的方式分配资源,则可以防止死锁。
  • 数据库管理系统分析事务的操作是否会造成死锁情况。如果他们这样做了,那么DBMS将永远不允许执行该事务。

等待死计划

在这种方案中,如果一个事务请求另一个事务已经用冲突锁持有的资源,则DBMS只需检查两个事务的时间戳。它允许较旧的事务等待直到资源可供执行。

假设有两个事务Ti和Tj,并且TS(T)是任何事务T的时间戳。如果T2持有其他事务的锁,并且T1正在请求T2拥有的资源,那么DBMS将执行以下操作:

  • 检查TS(Ti)
  • 检查TS(T i )

伤口等待方案

  • 在伤口等待方案中,如果较早的事务请求由较年轻的事务持有的资源,则较早的事务将迫使较年轻的事务杀死该事务并释放该资源。一分钟的延迟后,较年轻的事务将重新启动,但具有相同的时间戳。
  • 如果较旧的事务已拥有Younger事务所请求的资源,则将要求较早的事务等待,直到较早的事务释放它。
  • 下一主题DBMS并发控制