Предположим, что все базы данных, участвующие в распределенной транзакции, реализованные с двухфазным сигналом фиксации, готовы к фиксации и имеют необходимые блокировки. Координатор сигнализирует фиксации, и все базы данных выполняют свою часть транзакции, но одна база данных SQL встречает ошибку с разделителем на нуль в результате контроля над программированием, который не учитывает эту возможность. Поскольку координатор уже сигнализировал всем, что происходит в результате этого деления на ноль?Защищает ли двухфазная фиксация от окончательных сбоев?
ответ
Вторая фаза фиксации обычно не содержит кода пользователя, который может выйти из строя. Участвующие менеджеры ресурсов должны гарантировать, что сбой не может произойти. Если эта гарантия нарушена, никакие гарантии не могут быть предоставлены протоколом.
Двухэтапная фиксация пытается решить Two Generals Problem. Нет полного решения этой проблемы. TPC является приближением.
Другой способ, с помощью которого TPC может выйти из строя, - в случае сетевого раздела. Некоторые менеджеры ресурсов могут выполнить окончательную фиксацию, но некоторые из них могут не получить это сообщение. Опять же, эта проблема неразрешима. Даже повторные попытки не могут решить эту проблему.
Вы можете даже вызвать эту проблему в реальных условиях: запустите все участвующие узлы в стресс-тесте и потяните сетевой кабель в произвольной точке. С большой вероятностью ваши распределенные базы данных теперь несовместимы, потому что некоторые сообщения о передаче теряются очень неудобно.
Как и когда вы ожидаете, что эта ошибка произойдет? Я предполагаю, что такая ошибка произойдет во время первой фазы, что приведет к откату. – Oded
Вы имеете в виду, что определение фазы precommit состоит в том, что все фактически полностью выполняют свою часть транзакции, а эта фаза фиксации определяется просто записью «» в журнал, но критическая точка заключается в том, что фактическое выполнение транзакции не происходит во время фазы фиксации? Все статьи о двухфазной фиксации, с которыми я столкнулся, никогда точно не указывают, когда каждая база данных выполняет свою часть транзакции. –
user782220
Ну, что происходит _actually_, является спецификой реализации. Но да, это будет в значительной степени то, что происходит (изменения сделаны, и единственное, что ждут распределенные базы данных, - это ответ от координатора, чтобы «закрыть сделку», совершив). – Oded