Предположим, что все базы данных, участвующие в распределенной транзакции, реализованы с двухфазным сигналом фиксации, что они готовы к фиксации и имеют необходимые блокировки. Координатор сигнализирует о фиксации, и все базы данных выполняют свою часть транзакции, но одна база данных SQL обнаруживает ошибку деления на ноль в результате программного надзора, который не учитывает эту возможность. Поскольку координатор уже дал сигнал о приверженности всем, что произойдет в результате этого деления на ноль?
Защищает ли двухфазная фиксация от ошибок окончательной фиксации?
Ответы (1)
Вторая фаза фиксации обычно не содержит пользовательского кода, который может дать сбой. Участвующие менеджеры ресурсов должны гарантировать, что сбой не произойдет. В случае нарушения этой гарантии протокол не может предоставить никаких гарантий.
Двухэтапная фиксация пытается решить проблему двух генералов. Полного решения этой проблемы нет. TPC является приблизительным.
Другой способ отказа TPC - это сетевой раздел. Некоторые менеджеры ресурсов могут выполнить окончательную фиксацию, но некоторые могут не получить это сообщение. Опять же, эта проблема неразрешима. Даже повторные попытки не могут решить эту проблему.
Вы даже можете вызвать эту проблему в реальных условиях: запустите все участвующие узлы в стресс-тесте и потяните сетевой кабель в произвольной точке. С большой вероятностью ваши распределенные базы данных теперь несовместимы, потому что некоторые сообщения фиксации были потеряны в очень неудобное время.