В настоящее время я изучаю наихудшие сценарии протоколов атомарной фиксации, таких как 2PC и 3PC, и застрял в точке, в которой я не могу выяснить , почему 3PC может гарантировать атомарность . То есть, как это гарантирует, что, если когорта A фиксирует, когорта B также фиксирует?
Вот упрощенный 3PC из статьи Википедии :
Теперь давайте предположим следующий случай:
- В транзакции участвуют две когорты (A и B)
- Оба выполняют свою работу, затем голосуют за коммит
- Координатор теперь отправляет предварительные сообщения ...
- A получает предварительное сообщение, подтверждает, а затем длительное время отключается
- B не получает сообщение предварительной передачи (какой бы ни была причина) и, таким образом, все еще находится в "неопределенном" состоянии
Результаты:
- Координатор прерывает транзакцию, потому что не все сообщения о предварительных подтверждениях были отправлены и подтверждены успешно
- A , находящийся в состоянии предварительной фиксации, все еще находится в автономном режиме, поэтому время ожидания истекло, и фиксирует
- B прерывает в любом случае: он либо остается в автономном режиме и отключается (вызывает прерывание), либо выходит в сеть и получает команду прерывания от координатора
И вот, у вас это есть: одна группа совершена, другая прервана. Транзакция ввернута.
Так чего мне здесь не хватает? В моем понимании, если автоматическая фиксация по тайм-ауту (в состоянии precommit) была заменена на бесконечное ожидание команды координатора, этот случай должен работать нормально.