DBMS死锁

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

例如:student表中,事务T1对某些行进行锁定,需要更新grade表中的某些行。 同时,事务T2在等级表中的某些行上保持锁定,并且需要更新事务T1持有的Student表中的行。

现在,出现了问题。事务T1正在等待T2释放其锁定,同样,事务T2正在等待T1释放其锁定。 所有活动都陷入停顿状态并保持停滞状态。 它将保持静止状态,直到DBMS检测到死锁并中止其中一个事务。

死锁避免

当数据库陷入死锁状态时,最好避免使用数据库而不是中止或重新启动数据库。 这是浪费时间和资源。
死锁避免机制用于预先检测任何死锁情况。 像“等待图”这样的方法用于检测死锁情况,但该方法仅适用于较小的数据库。 对于较大的数据库,可以使用死锁预防方法。

死锁检测

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

等待图

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

等待上述场景的图如下所示:

死锁预防

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

等待模式

在此模式中,如果事务请求已由另一个事务保持冲突锁定的资源,则DBMS只检查两个事务的时间戳。 它允许旧事务等待资源可用于执行。

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

  • 检查TS(Ti)<TS(Tj) - 如果Ti是较旧的事务并且Tj保留了一些资源,则允许Ti等待直到数据项可用于执行。这意味着如果较旧的事务正在等待由较年轻的事务锁定的资源,则允许较旧的事务等待资源直到它可用。
  • 检查TS(Ti)<TS(Tj) - 如果Ti是较旧的事务并且保留了一些资源并且如果Tj正在等待它,则Tj被杀死并且随后以随机延迟但具有相同时间戳重新启动。

创伤等待模式

  • 在创伤等待方案中,如果较旧的事务请求由较新的事务持有的资源,则较旧的事务迫使较新的事务杀死该事务并释放该资源。 在分钟延迟之后,重新启动较新的事务但具有相同的时间戳。
  • 如果旧事务持有较新事务请求的资源,则要求较新的事务等到较早发布它。

上一篇:DBMS检查点

下一篇:DBMS并发控制

关注微信小程序
程序员编程王-随时随地学编程

扫描二维码
程序员编程王

扫一扫关注最新编程教程