|
Я не знакю как там двухфазный коммит устроен, но всё равно уверен что такая ситуация там возможна. |
не знаешь - прочитай. www.ibase.ru/devinfo/ibtrans.htm
при использовании 2PC бояться надо не этого, а другого. Вот цитата из пока неопубликованной статьи (если в некоторых местах сложно написано - извините, это черновой вариант):
...
Двухфазный commit
Казалось бы - в чем уязвимость этой вполне отработанной технологии? Давайте рассмотрим ее характеристики и варианты применения.
2PC стартует транзакцию над несколькими базами данных, и обладает определенной логикой применения изменений в случае сбоя на этапе подтверждения (commit) такой транзакции. Для того, чтобы во всех базах данных, участвующих в распределенной транзакции, данные были или применены или отменены, до commit или rollback в каждой базе данных такая транзакция помечается состоянием "in Limbo". Это означает, что до момента окончательной фиксации или отмены изменений ни в одной из таких базах данных версии, помеченные такой транзакцией, нельзя было бы удалить отдельно. То есть, это требование согласованности такой транзакции.
Значит, версии записей, помеченные "in Limbo", нельзя удалить, их нельзя обновить, и даже для backup есть специальный ключ -L, позволяющий игнорировать такие версии записей. Отсюда мы делаем вывод, что если при выполнении транзакции 2PC произошел сбой, то нормальная работа приложений может быть парализована до устранения "застрявших" версий записи путем commit/rollback двухфазной транзакции на всех базах данных, участвовавших в транзакции.
Теперь давайте рассмотрим, как "расстояние" между базами данных влияет на невозможность работы до устранения проблем с незавершенными 2PC:
- базы данных, участвующие в транзакции 2PC, находятся на одном компьютере (сервере).
Здесь нет никаких проблем, т.к. либо сервер работает и доступ к обоим базам данных есть, либо сервер не работает целиком. То есть, время восстановления в случае работы сервера минимально - запускаем gfix в автоматическом режиме или в ручном режиме указываем что делать с такими транзакциями (вопрос повреждения одной из базы не рассматриваем, все это уже было описано выше).
- базы данных, участвующие в транзакции 2PC, разнесены на 2 компьютера, находящиеся в локальной сети.
Здесь основная проблема в физической доступности одного компьютера относительно другого. Если они достаточно близко, то после ремонтных действий на одном из серверов можно быстро запустить процедуру восстановления транзакций 2PC.
- базы данных находятся на компьютерах, разделенных модемной связью. Например, между такими базами данных производится репликация путем использования транзакций 2PC.
Это худший из вариантов, потому что нарушение модемной связи может прозойти по массе причин и на непредсказуемо длительный срок. Если не предусмотрен другой способ доставки реплицируемых данных на тот или иной сервер, никакого другого выхода кроме как gbak -b -L (создать резервную копию с игнорированием версий in Limbo и восстановленить БД из резервной копии) нет.
Отсюда делаем вывод, что наихудшим вариантом является использование 2PC на модемной связи.
...