Nad*_*ati 29 database deadlock database-deadlocks
等待死亡和伤口等待有什么区别?
我发现两种防止死锁的技术都做同样的事情(老回程的回滚).
可以任何机构解释我,他们与适当的例子有什么区别.
Par*_*tel 56
等待死模式:它是一种防止死锁的非抢先技术.当事务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将等待.
在这两种情况下,中止进入系统的事务都将中止.
Parth给出了详细的答案.在这里,我以不同的方式总结它.
假设Ti请求由Tj持有的锁.下表总结了等待模具和伤口等待方案所采取的措施:
wait-die wound-wait
Ti is younger than Tj Ti dies Ti waits
Ti is older than Tj Ti waits Tj aborts
Run Code Online (Sandbox Code Playgroud)
两种方案都倾向于使用较旧时间戳的旧事务.
等待模:当旧的事务试图锁定已锁定由一个DB元素年轻的交易,它等待。当较新的事务尝试锁定已被较旧事务锁定的 DB 元素时,它就会死亡。
伤口等待:当较旧的事务尝试锁定已被较年轻事务锁定的数据库元素时,它会伤害较年轻的事务。当较新的事务尝试锁定已被较旧事务锁定的数据库元素时,它会等待。
参考: