等待-死亡算法和伤害-等待算法有何区别?
这两种死锁预防技术似乎在做同样的事情:回滚旧进程。
它们之间的区别是什么?
请提供一个适当的示例来对比这两个算法。
等待-死亡算法和伤害-等待算法有何区别?
这两种死锁预防技术似乎在做同样的事情:回滚旧进程。
它们之间的区别是什么?
请提供一个适当的示例来对比这两个算法。
这是一种用于死锁预防的非抢占技术。 当事务Tn请求一个当前由Tk持有的数据项时, 只有当Tn的时间戳小于Tk的时间戳(即Tn比Tk旧)时, Tn才能等待,否则将杀死("die")Tn。
在这个方案中,如果一个事务请求锁定已被另一个事务以冲突锁定方式持有的资源(数据项), 那么可能会发生以下两种情况之一:
Timestamp(Tn) < Timestamp(Tk) - 即Tn请求冲突锁定但比Tk旧 - 那么Tn就可以 "等待" 直到数据项可用。
Timestamp(Tn) > Timestamp(Tk) - 即Tn比Tk年轻 - 那么Tn将被杀死("dies")。 Tn稍后会以随机延迟但具有相同时间戳(n)重新启动。
这个方案允许旧的事务 "等待" ,但是杀死年轻的事务 ("die")。
假设事务T5,T10和T15的时间戳分别为5、10和15。
如果T5请求一个由T10持有的数据项,则T5将 "等待"。
如果T15请求一个由T10持有的数据项,则T15将被杀死("die")。
这是一种用于死锁预防的抢占技术。 这是等待-抢占策略的对应方案。 当事务Tn请求一个当前由Tk持有的数据项时, 只有当Tn的时间戳大于Tk的时间戳时,Tn才能等待, 否则将杀死Tk(即Tn会伤害Tk)。
在这个方案中,如果一个事务请求锁定已被另一个事务以冲突锁定方式持有的资源(数据项), 那么可能会发生以下两种情况之一:
时间戳(Tn) < 时间戳(Tk),那么Tn会强制结束Tk,也就是说Tn会“创伤”Tk。Tk稍后会以同样的时间戳(k)但随机延迟重新启动。
时间戳(Tn) > 时间戳(Tk),那么Tn会被强制“等待”,直到资源可用。
这个方案允许较年轻的事务在较老的事务持有锁时“等待”,但如果较老的事务请求一个已经由较年轻的事务持有的项的锁,它将强制挂起“创伤”较年轻的事务。
假设事务T5、T10和T15分别具有时间戳5、10和15。
如果T5请求由T10持有的数据项,则数据项将从T10中抢占,并暂停T10。(“创伤”)
如果T15请求由T10持有的数据项,则T15将“等待”。
在这两种情况下,只有以较“晚”的时间戳进入系统的事务(即较年轻的事务)才可能被强制结束并重新启动。
Parth已经给出了详细的答案。这里我用不同的方式进行总结。
假设Tn请求由Tk持有的锁。以下表格总结了等待死和伤害等待方案的操作:
wait-die wound-wait
Tn is younger than Tk Tn dies Tn waits
Tn is older than Tk Tn waits Tk aborts
这两种方案都更喜欢时间戳较早的旧交易。
die
和 abort/rollback
是一样的吗? - P_95die
和abort/rollback是相同的意思。 - Jingguo Yaowait-die: 当一个年长的事务试图锁定被年轻的事务锁定的数据库元素时,它会等待。当一个年轻的事务试图锁定被年长的事务锁定的数据库元素时,它会终止。
wound-wait: 当一个年长的事务试图锁定被年轻的事务锁定的数据库元素时,它会伤害年轻的事务。当一个年轻的事务试图锁定被年长的事务锁定的数据库元素时,它会等待。
参考资料:
通过比较两个相关主题可以更好地理解它们,因此,等待死亡(wait-die)和伤口等待(wound-wait)之间的相似之处包括:
等待死亡(wait-die)和伤口等待(wound-wait)之间的差异包括:
Tn is older than Tk Tn is younger than Tk
wait-die Tn waits Tn dies
wound-wait Tk aborts Tn waits
两种方案都更喜欢时间戳较旧的旧交易。