2015-02-08 2 views
1

Я хочу обернуть вызов внешней веб-службы WCF и локальный вызов базы данных (nhibernate) в одной атомной транзакции.Атомная транзакция для службы WCF и локальной базы данных

Возможно ли это?

На данный момент я делаю следующее:

  1. Выполните обновление на локальной базе данных.
  2. Выполнение обновления на веб-сервисе.
  3. Если вызов веб-службы успешно совершает локальные изменения в базе данных.

Но что произойдет, если он не сработает?

+0

Внешняя услуга также WCF? –

+0

Да, внешняя служба также является WCF. –

ответ

0

Я принимаю внешний веб-сервис Вы имеете в виду услугу, которая отображается через общедоступную сеть.

Если внешняя служба поддерживает WS-Atomic Transaction, тогда да, возможно, распространить локальную транзакцию на другую.

Однако сомнительно, если этот подход является разумным, если внешняя служба также не является wcf по отношению к wsHttpBinding.

Если внешняя служба не является wcf, то, скорее всего, в интеграции будет значительная боль; хотя WS-AT предназначен для обеспечения совместимости, на практике почти наверняка будет изменяться то, как протокол интерпретируется различными поставщиками, что может привести к тому, что клиент и служба будут эффективно не взаимодействовать.

Но что произойдет, если он не сработает?

В качестве альтернативного решения я рассмотрел бы шаблон compensatory для решения этой проблемы. В качестве примера:

  1. Обновление БД
  2. Позвони
  3. Если услуга вызова успеха, совершить DB
  4. Если сбой вызова службы, не совершайте DB

Преимущество здесь в том, что согласованность системы может предоставляться в одном месте. Однако теперь ваша проблема заключается в том, как определить, был ли вызов успешным или нет.

К сожалению, когда вы совершаете служебный вызов, всегда возможен вызов для возврата отказа, но на самом деле это удается. Хорошим примером этого является тайм-аут службы.

Как вы на самом деле говорите, если вы вызвали ошибку? Единственный способ - выполнить поиск по удаленному ресурсу для разработки, если состояние системы включает ваше обновление.

+0

Спасибо за информацию :-) У вас есть пример того, как я использую WS-Atomic Transaction? –

+0

Вы контролируете внешнюю службу? Знаете ли вы, что он настроен на поддержку WS-AT?Когда вы говорите * внешний * сервис, вы имеете в виду, что это не в локальной сети? Через общедоступную сеть? –

+0

Причина, по которой я спрашиваю, есть гораздо более простое решение, если вам не нужно выходить за пределы локальной сети. –

Смежные вопросы