Транзакция в 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.
Включение транзакции WCF
Чтобы успешно включить транзакцию WCF, необходимо последовательно выполнить последовательность из шести шагов. Необходимые шаги обсуждаются ниже.
Шаг 1 — Создание двух сервисов WCF
Первым шагом в этом отношении является создание двух сервисных проектов в WCF для участия в одной транзакции. Транзакции базы данных будут выполняться в обеих этих службах, и будет понятно, что они объединены транзакцией WCF. Веб-приложение WCFTransactions также было создано для использования двух созданных сервисов в одной области транзакции.
Шаг 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 возникает исключение.