Учебники

WCF — Сделки

Транзакция в WCF — это набор операций, которые следуют некоторым свойствам, которые в совокупности известны как ACID. Здесь, если происходит сбой одной операции, происходит сбой всей системы автоматически. Когда заказ размещен онлайн, происходит транзакция. Следующий пример может быть полезен для понимания процесса транзакции в более простых терминах.

пример

Предположим, вы заказали ЖК-телевизор в интернет-магазине и собираетесь оплатить сумму кредитной картой. Когда вы вводите необходимую информацию для размещения заказа, две операции происходят одновременно.

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

Свойства транзакции WCF

Вот четыре свойства, за которыми следует транзакция WCF:

  • Атомарный — все операции должны действовать как единая неделимая операция при завершении транзакции.

  • Согласованность — какой бы ни была заданная операция, система всегда находится в состоянии согласованности, т. Е. Результат транзакции всегда соответствует ожидаемому.

  • Изоляция — промежуточное состояние системы невидимо ни для каких сущностей внешнего мира до завершения транзакции.

  • Долговечность — подтвержденное состояние поддерживается независимо от любого вида сбоя (аппаратное обеспечение, отключение питания и т. Д.)

Атомарный — все операции должны действовать как единая неделимая операция при завершении транзакции.

Согласованность — какой бы ни была заданная операция, система всегда находится в состоянии согласованности, т. Е. Результат транзакции всегда соответствует ожидаемому.

Изоляция — промежуточное состояние системы невидимо ни для каких сущностей внешнего мира до завершения транзакции.

Долговечность — подтвержденное состояние поддерживается независимо от любого вида сбоя (аппаратное обеспечение, отключение питания и т. Д.)

При настройке транзакции WCF необходимо учитывать некоторые факторы. Это обязательное и эксплуатационное поведение.

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

  • NetTcpBinding
  • NetNamedPipeBinding
  • WsHttpBinding
  • WSDualHttpBinding
  • WSFederationHttpBinding

Поведение операции. В то время как привязка облегчает путь для распространения транзакции, операция заботится об обработке транзакции, а также о конфигурации операции. Поведение операции в основном использует два атрибута: TransactionFlow и TransactionScopeRequired. Здесь следует отметить, что TransactionFlow имеет в основном три значения, а именно: Разрешено, Обязательное и Не разрешено.

Следующий код показывает, облегчает ли изменение конфигурации привязки и контракта операции распространение клиента.

<bindings> 
   <wsHttpBinding> 
      <binding name = "MandatoryTransBinding" transactionFlow = "true"> 
         <reliableSession enabled ="true"/>
      </binding>
   </wsHttpBinding> 
</bindings>

Протокол транзакций

WCF использует три типа протоколов для транзакций —

  • облегченный
  • Оле Транзакция
  • WS-Атомная транзакция (WS-AT)

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

Этапы транзакции WCF

В транзакции WCF есть две фазы, как показано на следующем рисунке.

Этапы транзакций Wcf 1

  • Этап подготовки — на этом этапе менеджер транзакций проверяет, готовы ли все объекты принять транзакцию или нет.

  • Фаза фиксации — На этом этапе приверженность сущностей начинается в реальности.

Этап подготовки — на этом этапе менеджер транзакций проверяет, готовы ли все объекты принять транзакцию или нет.

Фаза фиксации — На этом этапе приверженность сущностей начинается в реальности.

На следующем рисунке показаны функции обеих фаз транзакции WCF.

Этапы транзакции Wcf 2

Включение транзакции WCF

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

Шаг 1 — Создание двух сервисов WCF

Первым шагом в этом отношении является создание двух сервисных проектов в WCF для участия в одной транзакции. Транзакции базы данных будут выполняться в обеих этих службах, и будет понятно, что они объединены транзакцией WCF. Веб-приложение WCFTransactions также было создано для использования двух созданных сервисов в одной области транзакции.

Wcf Transaction Enable 1

Шаг 2 — Создание метода и его атрибуция с атрибутом TransactionFlow

Здесь будет создан метод UpdateData для обеих служб WCF для вставки в базу данных с атрибутом OperationContract. Для выполнения этой задачи сначала создается интерфейсный класс с помощью атрибута ServiceContract. Для включения транзакции во вновь созданном методе она связывается с TransactionFlow, и транзакции разрешены с использованием значения Allowed.

[ServiceContract]
public interface IService1 {
   [OperationContract]
   [TransactionFlow(TransactionFlowOption.Allowed)]
   void UpdateData();
}

Шаг 3 — Внедрение службы WCF с атрибутом TransactionScopeRequired

Это делается с помощью кода, показанного ниже —

[OperationBehavior(TransactionScopeRequired = true)]
public void UpdateData() {
   try {
      SqlConnection objConnection = new SqlConnection(strConnection);
      objConnection.Open();
      
      using(SqlTransaction transaction = Program.dbConnection.BeginTransaction()) {
     	   Boolean doRollback = false;
     	   using(SqlCommand cmd = new SqlCommand(
            "insert into Customer (Customer name, Customer code) values ('sss', 'sss')"objConnection))
         
     	   try {
            cmd.ExecuteNonQuery();
     	   } catch(SqlException) {
            doRollback = true;
            break;
     	   }
      }
      
      if(doRollback)
         transaction.Rollback();
      else
         transaction.Commit();  
   }
   finally {
      objConection.Close();
   }
}

Шаг 4 — Включение потока транзакций с помощью файла конфигурации службы WCF

Его кодирование выполняется следующим образом:

<bindings>
   <wsHttpBinding>
      <binding name = "TransactionalBind" transactionFlow = "true"/>
   </wsHttpBinding>
</bindings>

Крайне важно прикрепить допустимую привязку транзакции к конечной точке, чтобы предоставить сервис WCF.

<endpoint address = "" binding = "wsHttpBinding" bindingConfiguration = "TransactionalBind" contract = "WcfService1.IService1">

Шаг 5 — Вызов обоих сервисов в одной транзакции

Здесь вышеупомянутые две службы вызываются в одной транзакции, и для этой цели объект TransactionScope используется для группировки обеих служб. Метод Complete указанного выше объекта вызывается для фиксации транзакции WCF. Для отката необходимо вызвать метод Dispose.

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) {
   try {
      // Call your webservice transactions here
      ts.Complete();
   } catch (Exception ex) {
      ts.Dispose();
   }
}

Небольшой фрагмент полного кода, в котором транзакции WCF сгруппированы в одной области видимости, изображен ниже —

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) {
   try {
      ServiceReference1.Service1Client obj = newServiceReference1.Service1Client();
      obj.UpdateData();
      ServiceReference2.Service1Client obj1 = new ServiceReference2.Service1Client();
      obj1.UpdateData();
      ts.Complete();
   } catch (Exception ex) {
      ts.Dispose();
   }
}

Шаг 6 — Тестирование транзакции WCF

Тестирование выполняется на 6-м и последнем шаге, и после вызова 1-й службы WCF возникает исключение.