2016-02-15 7 views
1

Клиентское приложение звонит 2 различные службы WCF в одном TransactionScope, в надежде откат всей транзакции, если один из вызовов не может так:WCF транзакций над несколькими службами

using (var transaction = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) 
{ 

    proxy1.UpdateThing(data); 
    proxy2.UpdateSomeOtherThing(data); 

    transaction.Complete(); 
} 

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

Как я должен работать в этом сценарии? Являются ли DependentTransactions способ пойти сюда?

Обе службы размещены на одной машине, оба имеют wsHttpBinding с TransactionFlow = true. Транзакция работает для каждой службы изолированно, это когда вызов использовал обе службы, например, в примере, которые не работают. Обе услуги украшены соответствующими аннотациями.

Исключение - это всего лишь сложный бросок в одной из служб, для проверки этого.

Стоит отметить, что обе службы используют EF для обработки своих данных в базе данных.

+0

Является proxy1 конечной точки и/или операции в состоянии обрабатывать транзакции? Если службы для proxy1 и proxy2 находятся под вашим контролем, возможно, проверьте эту статью, чтобы включить распределенные транзакции: http://www.c-sharpcorner.com/UploadFile/81a718/simple-steps-to-enable-transactions-in- wcf/ – martennis

+0

Да, оба имеют TransactionFlow на интерфейсе и TransactionScopeRequired заданы соответствующие методы. – Apeiron

+0

Какие привязки вы используете? Некоторые привязки не поддерживают транзакции. – martennis

ответ

2

Для включения транзакций в WCF вам нужно намного больше, чем область транзакций у вас.

Чтобы добавить поддержку транзакций службы WCF, вы будете принимать следующие меры: поддержку транзакций

  • Добавить к договору оказания услуг. Это необходимо.
  • Добавить поддержку транзакций в код, который реализует услугу договора. Это необходимо.
  • Настроить транзакции в коде реализации . Это необязательно.
  • Включить операции по привязке . Это необходимо.

Чтобы начать транзакцию в клиентском приложении, необходимо выполнить следующие действия:

  • Добавить поддержку транзакций в прокси-класса.
  • Включить операции по привязке.
  • Используйте класс TransactionScope для начала транзакции.

Чтобы узнать, как реализовать это вы можете прочитать (источник): Transactions in WCF Services

+0

Да, как указано в OP, транзакционное поведение работает независимо от службы. Когда мы пересекаем границы служб, он начинает разваливаться. – Apeiron