本文概述
- 避免死锁
- 死锁检测
- 防止死锁
【DBMS中的死锁】例如:在学生表中, 事务T1在某些行上持有锁, 并且需要更新成绩表中的某些行。同时, 事务T2在成绩表中的某些行上保持锁定, 并且需要更新事务T1所持有的学生表中的行。
现在, 出现了主要问题。现在, 事务T1正在等待T2释放其锁定, 并且类似地, 事务T2正在等待T1释放其锁定。所有活动都停止并保持静止状态。在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将被杀死并稍后以随机延迟但具有相同的时间戳重新启动。
- 在伤口等待方案中, 如果较旧的事务请求由较年轻的事务持有的资源, 则较早的事务将迫使较年轻的事务杀死该事务并释放该资源。一分钟的延迟后, 较年轻的事务将重新启动, 但具有相同的时间戳。
- 如果较早的事务已拥有Younger事务所请求的资源, 则要求较早的事务等待, 直到较早的事务释放它。
Next Topic DBMS Concurrency Control
← prev next →
推荐阅读
- DBMS与文件系统
- DBMS视图可序列化
- DBMS基于验证的协议
- DBMS时间戳排序协议
- DBMS三种架构架构
- DBMS Thomas的写入规则
- DBMS第三范式(3NF)
- DBMS可串行性测试
- DBMS静态哈希解释