等待死亡和伤口等待有什么区别?

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将等待.

在这两种情况下,中止进入系统的事务都将中止.

  • 等待死亡和伤口等待首先在http://dl.acm.org/citation.cfm?id=320260中提出. (3认同)
  • 我的助记符是:将策略名称放在时间线上。连字符左边是旧的,右边是新的。每个动词(等待、受伤、死亡)都是从一个固定的事务 Tn 来看的。这比听起来容易:**伤口等待**:我老了:伤口,我年轻:等待;**等死**:我老了:等等,我还年轻:死。 (3认同)

Jin*_*Yao 8

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)

两种方案都倾向于使用较旧时间戳的旧事务.

  • @ P_95是,`die`与中止/回滚相同。 (2认同)

Jas*_*Law 7

等待模:当旧的事务试图锁定已锁定由一个DB元素年轻的交易,它等待。当较新的事务尝试锁定已被较旧事务锁定的 DB 元素时,它就会死亡

伤口等待:当较旧的事务尝试锁定已被较年轻事务锁定的数据库元素时,它会伤害较年轻的事务。当较新的事务尝试锁定已被较旧事务锁定的数据库元素时,它会等待


参考: