DBMS中的死锁

本文概述

  • 避免死锁
  • 死锁检测
  • 防止死锁
死锁是指两个或多个事务无限期地等待对方放弃锁的情况。死锁被认为是DBMS中最令人担忧的并发症之一, 因为没有任务完成并且永远处于等待状态。
【DBMS中的死锁】例如:在学生表中, 事务T1在某些行上持有锁, 并且需要更新成绩表中的某些行。同时, 事务T2在成绩表中的某些行上保持锁定, 并且需要更新事务T1所持有的学生表中的行。
现在, 出现了主要问题。现在, 事务T1正在等待T2释放其锁定, 并且类似地, 事务T2正在等待T1释放其锁定。所有活动都停止并保持静止状态。在DBMS检测到死锁并中止其中一个事务之前, 它将保持静止状态。
DBMS中的死锁

文章图片
避免死锁
  • 当数据库处于死锁状态时, 最好避免使用数据库, 而不要中止或恢复数据库。这是浪费时间和资源。
  • 死锁避免机制用于提前检测任何死锁情况。诸如“等待图形”之类的方法用于检测死锁情况, 但是此方法仅适用于较小的数据库。对于较大的数据库, 可以使用防死锁方法。
死锁检测 在数据库中, 当事务无限期地等待获取锁时, DBMS应该检测该事务是否涉及死锁。锁管理器维护“等待”图以检测数据库中的死锁周期。
等待图
  • 这是用于死锁检测的合适方法。在这种方法中, 将基于事务及其锁定来创建图。如果创建的图形具有循环或闭环, 则存在死锁。
  • 系统为每个正在等待其他事务持有的某些数据的事务维护等待图形。系统会继续检查图形, 如果图形中有任何循环。
等待上述情况的图表如下所示:
DBMS中的死锁

文章图片
防止死锁
  • 防止死锁的方法适用于大型数据库。如果以永不发生死锁的方式分配资源, 则可以防止死锁。
  • 数据库管理系统分析事务的操作是否可以创建死锁情况。如果他们这样做, 那么DBMS将永远不允许执行该事务。
等待模具方案
在此方案中, 如果一个事务请求另一个事务已经用冲突锁持有的资源, 则DBMS只需检查两个事务的时间戳。它允许较旧的事务等待直到资源可供执行。
假设有两个事务Ti和Tj, 并且TS(T)是任何事务T的时间戳。如果T2持有其他事务的锁, 并且T1请求T2拥有的资源, 则DBMS将执行以下操作:
  1. 检查TS(Ti)< TS(Tj)-如果Ti是较旧的事务, 并且Tj拥有一些资源, 则允许Ti等待直到可以执行该数据项。这意味着, 如果较早的事务正在等待被较早的事务锁定的资源, 则允许较早的事务等待资源直到可用。
  2. 检查TS(Ti)< TS(Tj)-如果Ti是较旧的事务并拥有一些资源, 并且Tj在等待它, 则Tj将被杀死并稍后以随机延迟但具有相同的时间戳重新启动。
伤口等待方案
  • 在伤口等待方案中, 如果较旧的事务请求由较年轻的事务持有的资源, 则较早的事务将迫使较年轻的事务杀死该事务并释放该资源。一分钟的延迟后, 较年轻的事务将重新启动, 但具有相同的时间戳。
  • 如果较早的事务已拥有Younger事务所请求的资源, 则要求较早的事务等待, 直到较早的事务释放它。

  • Next Topic DBMS Concurrency Control

    ← prev next →

    推荐阅读