饥饿或活锁是事务必须等待无限期才能获取锁的情况。
饥饿的原因——
- 如果锁定项目的等待方案不公平。 (优先队列)
- 受害者选择。 (同一笔交易被反复选为受害者)
- 资源泄漏。
- 通过拒绝服务攻击。
饥饿可以通过一个例子来最好地解释——假设数据库中有 3 个事务,即 T1、T2 和 T3,它们试图获取数据项“I”的锁。现在,假设调度程序将锁定授予 T1(可能是由于某些优先级),而其他两个事务正在等待锁定。 T1 的执行一结束,另一个事务T4 也过来请求解锁数据项I。现在,这次调度器授予T4 锁定,T2、T3 不得不再次等待。这样,如果新事务不断请求锁,T2 和 T3 可能需要无限期地等待,从而导致饥饿。
饥饿的解决方法是什么?
- 增加优先级——
当事务必须无限期等待时会发生饥饿,在这种情况下,我们可以增加该特定事务的优先级。但是这种解决方案的缺点是,其他事务可能必须等待更长时间,直到最高优先级的事务到来并继续进行。 - 受害者选择算法的修改 –
如果交易成为重复选择的牺牲品,则可以通过降低其优先于其他交易的优先级来修改算法。 - 先到先得的方法 –
可以采用一种公平的调度方法,即FCFS,其中事务可以按照请求锁的顺序获取对项目的锁。 - 等待死亡和受伤等待计划 –
这些是使用交易时间戳排序机制的方案。
详细研究参考:Wait die and Wound wait scheme