"wait-die" 和 "wound-wait" 死锁预防算法有什么区别?

What is the difference between "wait-die" and "wound-wait" deadlock prevention algorithms?

wait-die和wound-wait算法有什么区别?

这两种死锁预防技术似乎都在做同样的事情:回滚旧进程。

两者有什么区别?

请提供一个合适的例子来对比这两种算法。

Wait-Die 方案

它是一种 非抢占式 预防死锁的技术。 当事务Tn请求Tk当前持有的一个数据项时, 只有当 Tn 的时间戳小于 Tk 时才允许等待 (即Tn比Tk),否则Tn 被杀(“死”)。

在这个方案中,如果一个事务请求锁定一个资源(数据项), 它已经被另一个事务持有冲突锁,那么可能会出现以下两种可能性之一:

  1. 时间戳(Tn) < 时间戳(Tk ) - 即请求冲突锁的 Tn 比 Tk old − 然后 Tn 被允许“等待”直到数据项可用。

  2. 时间戳(Tn) > 时间戳(Tk) - 也就是说 Tn 比 Tk 年轻 − 然后 Tn 被杀死(“死亡”)。 Tn 稍后以随机延迟重新启动,但具有相同的时间戳 (n)。

此方案允许较旧的事务“等待”但杀死较新的事务(“死亡”)。

例子

假设交易 T5, T10, T15 有时间戳分别为 5、10 和 15。

如果T5请求T10持有的数据项,那么T5将“等待”。

如果T15请求T10持有的数据项,则T15将被杀死(“死”)。

伤口等待方案

这是一种先发制人技术,用于防止死锁。 它与等待死亡方案相对应。 当事务Tn请求Tk当前持有的一个数据项时, 只有Tn的时间戳大于Tk才允许等待, 否则 Tk 被杀死 (即Tk被Tn打伤)

在这个方案中,如果一个事务请求锁定一个资源(数据项), 它已经被另一个事务持有冲突锁,可能会出现以下两种可能性之一:

  1. 时间戳(Tn) < 时间戳(Tk), 然后 Tn 强制 Tk 被杀死 - 即 Tn “伤口” TkTk 稍后以随机延迟重新启动,但具有相同的时间戳 (k)。

  2. 时间戳(Tn) > 时间戳(Tk), 然后 Tn 被迫“等待”直到资源可用。

如果旧事务已经持有锁,此方案允许请求锁的新事务“等待”,但如果旧事务请求对项目的锁定,则强制暂停(“伤口”)新事务已经被小的抱走了。

例子

同样,假设事务T5、T10、T15有时间-分别标记 5、10 和 15。

如果T5请求一个T10持有的数据项, 然后数据项将从 T10 被抢占,T10 将被挂起。 (“受伤”)

如果T15请求T10持有的数据项,则T15将“等待”。

总结

在这两种情况下,只有在 之后 时间戳进入系统的事务(即较年轻的事务)可能会被终止并重新启动。

Parth给出了详细的解答。这里我换个方式总结一下。

假设Tn请求Tk持有的锁。下面table总结了wait-die和wound-wait方案所采取的行动:

                           wait-die         wound-wait
Tn is younger than Tk      Tn dies          Tn waits
Tn is older than Tk        Tn waits         Tk aborts
      

这两种方案都更喜欢具有较旧时间戳的较旧事务。

在这两种情况下,Old 总是冠军,即会存活下来。不同之处在于年轻交易的角度。

如果年轻的人正在请求年长的跨性别者持有的资源。 , 在 wait/die 他可以等待给予尊重,因为老 trans.If 年轻的人正在请求旧翻译持有的资源。, 在 wound/die 他将被迫回滚作为旧翻译。

在这两种方案中,旧的永远不会丢失。

参考:https://www.tutorialspoint.com/dbms/dbms_deadlock.htm

wait-die:当 older 事务试图锁定已被 锁定的 DB 元素时小 交易,它等待。当 younger 事务试图锁定已被 older 事务锁定的数据库元素时,它 dies.

wound-wait:当 older 事务尝试锁定已被 锁定的 DB 元素时年轻交易,它伤害年轻交易。当 younger 事务试图锁定已被 older 事务锁定的数据库元素时,它 waits.


参考文献:

@JingguoYao 的总结我会稍微改变一下。 我只是重新安排了它,因为对我(以及像我这样的其他人)来说,这样读起来更容易。

假设Tn请求Tk持有的锁。下面table总结了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

这两种方案都更喜欢具有较旧时间戳的较旧事务。

理解两个相关主题的最佳方式可以通过比较来实现。所以, wait-die 和 wound-wait 相似度:

  1. 较旧的事务将 "win" 覆盖较新的事务。
  2. 事务重新启动时,它们会保留时间戳。
  3. 最终,中止的(较新的)事务将成为系统中最旧的事务。

wait-die和wound wait的区别:

  1. 在 wait-die 中,当较新的事务请求较旧的事务持有的锁时,较新的事务被杀死。
  2. 在 wound-wait 中,当旧事务请求新事务持有的锁时,新事务被终止。

  • 当两条边都形成时,就会产生死锁,如图所示 多于。新事务向旧事务请求锁定,并且 旧事务向新事务请求锁定。
  • 这两种技术中的每一种都只是防止其中一条边被 在允许另一个边缘的同时形成,因此先发制人地防止 从形成循环开始。
  • 如果你注意到,在这两种策略中,年轻的交易都得到 中止。只有锁请求的发起者不同。中止 事务在稍后的时间点重新启动。