В чем разница между ожиданием и смертью?

В чем разница между ожиданием и смертью?

я обнаружил, что оба метода предотвращения тупиковых ситуаций делают одно и то же (откат старшего процесса).

Может ли любое тело объяснить мне, в чем разница между ними на подходящем примере.

7 ответов

Решение

Схема ожидания-смерти: это не превентивный метод предотвращения тупиков. Когда транзакция Ti запрашивает элемент данных, в настоящее время удерживаемый Tj, Ti может ждать, только если у него есть временная метка, меньшая, чем у Tj (то есть Ti старше, чем Tj), в противном случае Ti откатывается (умирает).

В этой схеме, если транзакция запрашивает блокировку ресурса (элемента данных), который уже удерживается с конфликтующей блокировкой другой транзакцией, то может возникнуть одна из двух возможностей:

(1) Если TS(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)

(2) Если TS(Ti) > TS(Tj), то Ti вынужден ждать, пока ресурс не станет доступен.

Эта схема позволяет младшей транзакции ждать; но когда более старая транзакция запрашивает элемент, принадлежащий младшей, более старая транзакция вынуждает более молодую транзакцию прервать и отпустить элемент.

Например:

Предположим, что транзакции T22, T23, T24 имеют метки времени 5, 10 и 15 соответственно. Если T22 запрашивает элемент данных, содержащийся в T23, то элемент данных будет выгружен из T23, а T23 будет откатываться. Если T24 запрашивает элемент данных, удерживаемый T23, то T24 будет ждать.

В обоих случаях транзакция, поступающая в систему на более позднем этапе, прерывается.

Парт дал подробный ответ. Здесь я резюмирую это по-другому.

Предположим, что Ti запрашивает блокировку, удерживаемую Tj. Следующая таблица суммирует действия, предпринятые для схем ожидания и смерти:

                           wait-die         wound-wait
Ti is younger than Tj      Ti dies          Ti waits
Ti is older than Tj        Ti waits         Tj aborts

Обе схемы предпочитают более старые транзакции со старыми временными метками.

wait-die: когда более старая транзакция пытается заблокировать элемент БД, который был заблокирован более молодой транзакцией, она ожидает. Когда младшая транзакция пытается заблокировать элемент БД, который был заблокирован более старой транзакцией, она умирает.

wound-wait: Когда более старая транзакция пытается заблокировать элемент БД, который был заблокирован более молодой транзакцией, это ранит более раннюю транзакцию. Когда младшая транзакция пытается заблокировать элемент БД, который был заблокирован более старой транзакцией, она ожидает.


Рекомендации:

Я поставлю резюме @JingguoYao немного по-другому. Я просто переставил его, потому что мне (и другим, как я) это легче читать.

Предположим, что Tn запрашивает блокировку, удерживаемую Tk. В следующей таблице приведены действия, предпринятые для схем ожидания-смерти и ранения-ожидания:

                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. Старая транзакция "выиграет" над новой транзакцией.
  2. При перезапуске транзакции они сохраняют свои временные метки.
  3. В конце концов, прерванные (более молодые) транзакции станут самыми старыми транзакциями в системе.

Разница между ожиданием смерти и ожиданием раны:

  1. В режиме ожидания новые транзакции завершаются, когда новая транзакция делает запрос на блокировку, удерживаемую более старыми транзакциями.
  2. В режиме ожидания ожидания новые транзакции уничтожаются, когда более старая транзакция делает запрос на блокировку, удерживаемую новыми транзакциями.

  • Тупик создается, когда формируются оба ребра, как показано на графике выше. Молодая транзакция запрашивает блокировку у старой транзакции, а старая транзакция запрашивает блокировку у молодой транзакции.
  • Каждый из двух методов просто предотвращает формирование одного из краев, позволяя при этом другому ребру, тем самым упреждающе предотвращая формирование цикла.
  • Если вы заметили, в обеих стратегиях молодая транзакция прерывается. Отличается только инициатор запроса на блокировку. Прерванные транзакции перезапускаются в более поздний момент времени.

В обоих случаях Старый всегда чемпион, т.е. выживет. Разница с более молодой точки зрения транзакции.

Если младший запрашивает ресурс, который хранится у старого транс. в ожидании / смерти он может ожидать уважения как Старый транс. Если младший запрашивает ресурс, находящийся у старого транс., в ранении / смерти он будет вынужден откатиться как Старый транс.

В обеих схемах старое никогда не теряется.

См. https://www.tutorialspoint.com/dbms/dbms_deadlock.htm

Другие вопросы по тегам