Гарантированы ли транзакции распределенной базы данных для фиксации / отката? - PullRequest
1 голос
/ 07 февраля 2011

У меня есть код приложения, который вставляет запись в локальную базу данных и запись в удаленную базу данных (через Oracle Database Link). Когда я фиксирую эту распределенную транзакцию, гарантируется ли, что как локальная, так и удаленная базы данных будут одновременно фиксировать или выполнять откат, или есть вероятность, что удаленная база данных могла бы зафиксировать, но локальная фиксация не удалась (или наоборот)?

1 Ответ

6 голосов
/ 07 февраля 2011

Я был бы удивлен, если бы Oracle не использовала эквивалент протокола Two-Phase Commit (2PC), который обеспечивает либо фиксацию, либо оба отката.

В 2PC есть этап, называемый этапом предварительной фиксации, когда главный (координирующий) экземпляр записывает свое собственное решение и сообщает всем участникам, что они готовы к фиксации (и сообщают о своем статусе - должен произойти сбой или может зафиксировать). Участники также готовятся к фиксации, и (если они могут зафиксировать) ждут дальнейших инструкций от координатора после сообщения координатору, что они готовы совершить. Когда все участники ответили, координатор записывает окончательное решение и отправляет это решение участникам, а затем принимает решение. Если мастер отказывает после записи решения, но перед успешной отправкой решения участникам, участники могут быть повешены в состоянии, когда они не могут ни зафиксировать, ни выполнить откат. Есть способы оправиться от этого. Если координатор не работает достаточно долго (например, выведен из строя в результате катастрофического сбоя в работе), вы можете столкнуться с проблемами; участники обычно заканчивают эвристическим откатом (предполагаемый откат), но это требует удивительной неудачи, чтобы вызвать какие-либо проблемы.

Есть альтернативы 2PC; чистый результат один и тот же - все коммиты или все откаты.

...