Как протокол трехфазной фиксации (3PC) может гарантировать атомарность?

В настоящее время я изучаю наихудшие сценарии атомарных протоколов фиксации, таких как 2PC и 3PC, и застрял на том этапе, когда не могу понять, почему 3PC может гарантировать атомарность. То есть, как это гарантирует, что если когорта A совершает коммит, то когорта B также совершает коммит?

Вот упрощенный 3PC из статьи Википедии:

Протокол фиксации 3PC, как показано в английской Википедии

Теперь предположим следующий случай:

  1. В транзакции участвуют две когорты (A и B)
  2. Оба делают свою работу, затем голосуют за фиксацию
  3. Coordinator now sends precommit messages...
    • A receives the precommit message, acknowledges, and then goes offline for a long time
    • B не получает сообщение о предварительной фиксации (какой бы ни была причина) и, таким образом, все еще находится в «неопределенном» состоянии.

Результаты:

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

И вот оно: одна когорта зафиксирована, другая прервана. Транзакция провалена.

Итак, что мне здесь не хватает? В моем понимании, если автоматическая фиксация по тайм-ауту (в состоянии предварительной фиксации) была заменена бесконечным ожиданием команды координатора, этот случай должен работать нормально.


person AndiDog    schedule 30.04.2010    source источник


Ответы (1)


Процитированная вами статья, кажется, довольно точно описывает эту возможность: «Основной недостаток этого алгоритма заключается в том, что он не может восстановиться в случае, если сеть каким-либо образом сегментирована». Отмеченный вами случай, когда «А» просто отключается, означает «сегментация сети» — т. е. «А» теперь находится в одном сегменте, а «Б» и «Координатор» — в другом. другой сегмент.

Различные расширенные протоколы 3PC для решения этой проблемы обсуждаются (среди прочего) в статье Кемпстер, Стерлинг и Танниш.

person Jerry Coffin    schedule 30.04.2010
comment
Хорошо, это подтверждает мой тезис. Я почитаю об этих протоколах на основе кворума. Спасибо - person AndiDog; 01.05.2010