wait-die和wound-wait之间有什么区别?
我发现两种预防死锁的技术都在做同样的事情(老回程的回滚)。
有人可以用适当的例子解释他们之间有什么区别吗?
答案 0 :(得分:51)
等待模式:这是一种防止死锁的非先发制人技术。当事务Ti请求当前由Tj持有的数据项时,允许Ti仅在其时间戳小于Tj的时间戳(即Ti早于Tj)时等待,否则Ti被回滚(死亡)。
在这个方案中,如果一个事务请求锁定一个资源(数据项),该资源已被另一个事务的冲突锁保持,那么可能会发生以下两种可能性之一 -
(1)如果TS(Ti)< TS(Tj) - 即请求冲突锁定的Ti,比Tj更旧 - 然后允许Ti等待数据项可用。
(2)如果TS(Ti)> TS(tj) - 即Ti比Tj更年轻 - 然后Ti死亡。 Ti随后会以随机延迟重新启动,但具有相同的时间戳。
此方案允许较旧的交易等待,但会杀死较年轻的交易。
例如:
假设事务T22,T23,T24分别具有时间戳5,10和15。如果T22请求T23持有的数据项,则T22将等待。如果T24请求T23持有的数据项,则T24将被回滚。
伤口等待方案:这是防止死锁的先发制人技术。它与等待模具方案相对应。当事务Ti请求当前由Tj持有的数据项时,允许Ti仅在其时间戳大于Tj的时间戳时等待,否则Tj被回滚(Tj受到Ti的伤害)。
在这个方案中,如果一个事务请求锁定一个资源(数据项),该资源已被另一个事务保持冲突锁定,则可能发生以下两种可能性之一 -
(1)如果TS(Ti)< TS(Tj),然后Ti迫使Tj回滚 - 即Ti伤口Tj。 Tj稍后以随机延迟重新启动但具有相同的时间戳。
(2)如果TS(Ti)> TS(Tj),然后Ti被迫等待资源可用。
这个方案,允许年轻的交易等待;但是当较旧的交易请求较年轻的交易时,较旧的交易会强制较年轻的交易中止并释放该项目。
例如:
假设事务T22,T23,T24分别具有时间戳5,10和15。如果T22请求T23持有的数据项,则数据项将从T23被抢占,T23将被回滚。如果T24请求T23持有的数据项,则T24将等待。
在这两种情况下,中止进入系统的事务都将中止。
答案 1 :(得分:6)
Parth给出了详细的答案。在这里,我以不同的方式总结它。
假设Ti请求由Tj持有的锁。下表总结了wait-die和wound-wait方案所采取的措施:
wait-die wound-wait
Ti is younger than Tj Ti dies Ti waits
Ti is older than Tj Ti waits Tj aborts
两种方案都倾向于使用较旧时间戳的较旧交易。
答案 2 :(得分:3)
我会把@JingguoYao的摘要有一点不同。 我只是重新排列了它,因为对我(以及其他像我这样的人)来说,这样读起来更容易。
假定T n 请求由T k 持有的锁。下表总结了为等待-等待和伤口等待方案采取的行动:
Tn is older than Tk Tn is younger than Tk
wait-die Tn waits Tn dies
wound-wait Tk aborts Tn waits
这两种方案都更喜欢带有较早时间戳记的较早事务。
答案 3 :(得分:1)
通过比较可以了解理解两个相关主题的最佳方法。所以, 等候模和伤口等待之间的相似性:
等待模具和伤口等待之间的区别:
答案 4 :(得分:0)
在这两种情况下,老是永远的冠军,即将生存。差异来自年轻的交易观点。
如果年轻人正在请求旧的trans持有的资源。在等待/死亡时,他可以等待尊重。如果年轻人正在请求由旧的trans持有的资源,在伤口/死亡中,他将被强制回滚为Old trans。
在这两个计划中,旧的永远都不会丢失。
答案 5 :(得分:0)
等待死:当较旧事务试图锁定被较年轻事务锁定的数据库元素时,它 >等待。当较年轻事务尝试锁定已被较旧事务锁定的数据库元素时,它将死亡。
伤口等待:当较旧事务试图锁定已被较年轻事务锁定的数据库元素时,它 >伤害较年轻的交易。当较年轻事务尝试锁定已被较旧事务锁定的DB元素时,它将等待。
参考文献: