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