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