WCF - 事务

WCF中的事务是一组遵循某些属性的操作,统称为ACID.在这里,如果单个操作失败,整个系统将自动失败.当订单在线时,会发生交易.以下示例有助于以更简单的术语理解交易过程.

示例

假设您已从在线商店订购了液晶电视并且您将通过您的信用卡支付金额.当您输入下订单所需的信息时,会同时进行两项操作.

一,指定的金额从您的银行账户中扣除,其次,供应商账户的金额相同.这两个操作必须成功执行才能成功完成事务.

WCF事务属性

以下是WCF事务的四个属性如下 :

  • Atomic : 所有操作必须在交易完成时作为单个不可分割的操作.

  • 一致性 : 无论操作集是什么,系统始终处于一致状态,即交易结果始终符合预期.

  • 隔离 : 在交易完成之前,外部世界的任何实体都看不到系统的中间状态.

  • 耐久性 : 无论出现何种故障(硬件,停电等),都会保持提交状态.

配置WCF事务时,有一些需要考虑的因素.这些是绑定和操作行为.

绑定 : 支持WCF中的事务的绑定只有少数几个,并且仅从这些绑定中做出选择至关重要,这些绑定在默认情况下保持禁用状态,并且应该被启用以获得对事务的必要支持.这些绑定如下 :

  • NetTcpBinding

  • NetNamedPipeBinding

  • WSHttpBinding

  • WSDualHttpBinding

  • WSFederationHttpBinding

操作行为 : 虽然绑定有助于事务传播的路径,但操作负责事务处理以及操作配置.操作行为主要使用两个属性:TransactionFlow和TransactionScopeRequired.在这里,应该注意TransactionFlow主要有三个值,分别是:Allowed,Mandatory和NotAllowed.

以下代码显示更改绑定和操作合同的配置是否有利客户端的传播.

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

交易协议

WCF使用三种类型的交易协议 :

  • 轻量级

  • Ole Transaction

  • WS-Atomic Transaction(WS-AT)

在这三者中,WS-AT是一种可互操作的协议,可以跨防火墙实现分布式事务流.但是,当事务严格基于Microsoft技术时,不应使用此协议.

WCF事务的阶段

有两个阶段WCF事务如下图所示.

Wcf Transaction Phase 1

  • 准备阶段 : 在此阶段,事务管理器检查是否所有实体都准备好为事务提交.

  • 提交阶段&minus ;在这个阶段,实体的承诺在现实中开始.

下图说明了WCF事务的两个阶段的功能.

Wcf Transaction Phase 2

启用WCF交易

要成功启用WCF事务,需要按顺序方式执行一系列的六个步骤.必要的步骤将在下面讨论.

步骤1 : 创建两个WCF服务

这方面最重要的一步是在WCF中构建两个服务项目以参与单个事务.将对这两种服务执行数据库事务,并且将理解它们如何通过WCF事务统一.还创建了WCFTransactions的Web应用程序,以在单个事务范围内使用两个创建的服务.

Wcf交易启用1

步骤2 : 使用TransactionFlow属性创建方法及其归属

此处,将为要使用OperationContract属性插入数据库的WCF服务创建UpdateData方法.要完成此任务,首先在ServiceContract属性的帮助下创建接口类.为了在新创建的方法中启用事务,它将使用TransactionFlow进行归因,并且允许使用允许的值进行事务.

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

第3步和第3步;使用TransactionScopeRequired属性实现WCF服务

b

使用下面显示的代码 :

[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步和最后一步完成,在调用第一个WCF服务之后,强制例外.

Wcf Transaction Enable 2