死锁是两个或多个事务无限期地等待彼此放弃锁定的情况。 死锁被认为是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被杀死并且随后以随机延迟但具有相同时间戳重新启动。