Как протокол трехфазной фиксации (3PC) может гарантировать атомарность? - PullRequest
7 голосов
/ 30 апреля 2010

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

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

3PC commit protocol as depicted on English Wikipedia

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

  1. В транзакции участвуют две когорты (A и B)
  2. Оба выполняют свою работу, затем голосуют за коммит
  3. Координатор теперь отправляет предварительные сообщения ...
    • A получает предварительное сообщение, подтверждает, а затем длительное время отключается
    • B не получает сообщение предварительной передачи (какой бы ни была причина) и, таким образом, все еще находится в "неопределенном" состоянии

Результаты:

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

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

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

1 Ответ

8 голосов
/ 30 апреля 2010

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

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

...