
444 Глава 7. Отказоустойчивость
ABORT,
что будет означать поломку координатора. Эта ситуация идентична си-
туации для протокола 2РС. Также аналогично координатор может находиться в
состоянии
WAIT,
ожидая голосов участников. По истечении заданного времени
координатор решает, что участник отказал, и обрывает транзакцию путем рас-
сылки сообщения GLOBALABORT.
Рассмотрим теперь блокировку координатора в состоянии
PRECOMMIT.
В
слу-
чае истечения заданного времени он приходит к выводу, что один из участников
отказал, но прочие участники знают, что они голосовали за подтверждение тран-
закции. Соответственно, координатор приказывает работающим участникам под-
твердить транзакцию путем рассылки сообщения GLOBALCOMMIT. Кроме то-
го,
он полагает, что протокол восстановления отказавшего участника поможет
подтвердить его часть транзакции после
того,
как этот участник будет восстановлен.
Участник Р может блокироваться в состоянии READY или
PRECOMMIT.
По-
сле окончания отведенного участнику Р на ожидание времени, Р в состоянии по-
нять,
что координатор отказал и нужно решать, что делать дальше. Как и в 2РС,
если Р при контакте с другим участником обнаружит, что он находится в состоя-
нии COMMIT (или ABORT), Р также переходит в это состояние. Кроме того, ес-
ли все участники находятся в состоянии
PRECOMMIT,
транзакция может быть
без проблем подтверждена.
Опять-таки, аналогично схеме 2РС, если другой участник Q по-прежнему на-
ходится в состоянии
INIT,
транзакция может быть совершенно спокойно пре-
рвана. Важно отметить, что Q может находиться в состоянии INIT только в том
случае, если ни один из участников не находится в состоянии PRECOMMIT Уча-
стник может перейти в состояние
PRECOMMIT,
только если координатор перед
сбоем сам перешел в состояние
PRECOMMIT,
а значит, получил голоса всех уча-
стников. Другими словами, участник не может оставаться в состоянии
INIT,
ко-
гда другой участник переходит в состояние PRECOMMIT
Если каждый из участников, с которым может связаться Р, находится в со-
стоянии READY (и вместе они образуют большинство), транзакция должна быть
прервана. Здесь следует отметить, что если один из участников отказывает, поз-
же он будет восстановлен. Однако ни
Р,
пи любой другой активный участник не
знают, в каком состоянии будет находиться отказавший участник после восста-
новления. Если процесс будет восстановлен в состоянии
INIT,
решение о преры-
вании транзакцрш
—
единственно верное. В наихудшем случае процесс может
восстановиться в состоянии
PRECOMMIT,
но и в этом случае он не сможет поме-
шать прерыванию транзакции.
Этим ситуация сильно отличается от протокола 2РС, где отказавший участ-
ник может восстановиться в состоянии
COMMIT,
тогда как все прочие участни-
ки будут находиться в состоянии
READY.
В этом случае оставшиеся рабочие
процессы не смогут принять итогового решения и вынуждены будут ожидать
восстановления отказавшего процесса. В ЗРС, если какой-то из рабочих процес-
сов находится в состоянии
READY,
отказавшие процессы не смогут восстано-
виться ни в каком другом состоянии, кроме
INIT,
ABORT или
PRECOMMIT.
По
этой причине оставшиеся невредимыми процессы всегда смогут прийти к итого-
вому решению.