Большой вопрос, является ли дублированных обновлений на веб-службы материи, и если они делают ли они могут быть обнаружены. Если вы можете обнаружить дубликаты (как правило, с уникальным номером транзакции), или если дубликаты не имеют значения, то вы можете создать надежный метод двухэтапного фиксации.
Если дублирующие транзакции для веб-службы не могут быть обнаружены, а обновления не являются идемпотентными, вам не повезло.
Это базовый алгоритм:
begin transaction;
do local work;
save information for external call;
set an appropriate time for next attempt;
mark external call as not performed;
commit work;
begin transaction;
make external call;
if successful
mark external call as performed (or delete the record)
else
set the time for the next attempt
commit;
Затем нужно регулярное задание, нить, или независимо от того, что делает что-то вроде этого:
for each record where the time for the next attempt <= now
begin work;
if the remote service has not performed this transaction
make the remote call;
if successful
mark as done;
else if too many attempts
mark the transaction as permanently failed,
alert operator;
else
set the time for the next attempt;
endif;
else
mark as done;
endif
commit;
endfor
Этот подход обрабатывает все условия отказа надежно, и гарантирует, что обе части работы в конечном итоге будут выполнены.
Основные отказы:
Сбой перед первым совершающих: Завершает все откат.
Сбой после первого коммита, но до завершения веб-службы (включая кратковременные сбои в самой веб-службе): Удаленная транзакция webservice воспроизводится задачей восстановления.
Сбой после завершения веб-службы, но до завершения второй фиксации: транзакция дублированного веб-сервиса обнаруживается задачей восстановления, а локальная запись удаляется.
Неудачи в задаче восстановления: по существу такие же, как и ошибки во второй транзакции.
Другие ноты:
Постепенное развинчивания подход полезен для неудач. Если на службе есть переходный отказ, вы хотите замедлить свои попытки.
Если у вас есть требование к заказу на внешнюю службу, вам может потребоваться дополнительная структура.
В зависимости от того, как вы реализуете задачу восстановления, вы можете просто оставить вызовы веб-службы для этой задачи и не иметь вторую транзакцию в основном потоке приложения.
Ответ на дополнительное требование: «Сделка две части должно быть сделано вместе, выполняя задания хрон синхронизировать таблицу не желательно»
Мое чтение этого требования: «две системы никогда не потерпит неудачу ».
Когда одна из систем (или обоих) систем вам нужна, чтобы поднять детали и примирить вещи. Вы можете использовать полнофункциональный монитор TP для координации транзакций, или вы можете создать простой монитор, такой как тот, который приведен в моем примере, который обрабатывает ваш конкретный случай. В любом случае, есть что-то, что отслеживает то, что происходит, чтобы все могло быть правильно разрешено после отказа.
Если ваше требование действительно состоит в том, что вещи всегда происходят вместе (а транзакционная очередь сообщений или два подхода с фиксированной фиксацией не работают для вас), вам лучше хранить данные для обеих систем в одной базе данных (иначе говоря, менеджер ресурсов ") и имеет одну транзакцию диспетчера ресурсов.
Если у вас есть решение этой проблемы, которая отвечает требованиям наличия двух отдельных систем, согласованных между несколькими транзакциями и никогда не требует последующего согласования после сбоя, вы должны написать его и опубликовать в журнале VLDB, ACM TODS или IEEE TKDE.
Сохранение транзакции открыто во время вызова веб-службы по-прежнему оставляет окна, в которых состояние является непоследовательным. Появляется окно, в котором локальная транзакция возвращается, но транзакция веб-сервиса завершается. – janm