📜  WCF-交易

📅  最后修改于: 2020-11-19 09:26:54             🧑  作者: Mango


WCF中的事务是遵循某些属性的一组操作,这些属性统称为ACID。在此,如果单个操作失败,则整个系统将自动失败。在线下订单时,将进行交易。下面的示例可以帮助您更简单地了解交易过程。

假设您已经从在线商店订购了液晶电视,并且打算用信用卡付款。当您输入下订单的必要信息时,两个操作会同时发生。

首先,指定的金额将从您的银行帐户中扣除,其次,供应商帐户将被记入相同的金额。这两个操作必须成功执行才能拥有成功的事务。

WCF交易属性

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

  • 原子-交易完成后,所有操作都必须作为一个不可分割的操作。

  • 一致性-无论是什么操作集,系统始终处于一致性状态,即事务的结果始终符合预期。

  • 隔离-交易完成之前,外部任何实体都看不到系统的中间状态。

  • 耐用性-不管任何类型的故障(硬件,电源中断等),都可以保持承诺状态。

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

绑定-在WCF中支持事务的绑定只有几个,至关重要的是仅从这些绑定中进行选择,这些绑定在默认情况下保持禁用状态,应启用以获得对事务的必要支持。这些绑定如下-

  • NetTcpBinding
  • NetNamedPipeBinding
  • WSHttpBinding
  • WSDualHttpBinding
  • WSFederationHttpBinding

操作行为-虽然绑定有助于事务传播的路径,但操作要注意事务处理以及操作配置。操作行为主要使用两个属性:TransactionFlow和TransactionScopeRequired。在此,应注意,TransactionFlow主要具有三个值,分别是:允许,强制和未允许。

以下代码显示更改绑定和操作协定的配置是否有助于客户端的传播。

 
    
       
         
      
    

交易协议

WCF使用三种协议进行交易-

  • 轻巧的
  • 交易
  • WS-原子事务(WS-AT)

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

WCF交易的阶段

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

Wcf交易阶段1

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

  • 承诺阶段-在此阶段,实体的承诺实际上开始了。

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

Wcf交易阶段2

启用WCF交易

为了成功启用WCF事务,需要按顺序执行一系列六个步骤。下面讨论了必要的步骤。

步骤1-创建两个WCF服务

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

Wcf交易启用1

第2步-方法创建及其通过TransactionFlow属性的归属

在这里,将为两个WCF服务创建一个UpdateData方法,以使用OperationContract属性将其插入数据库。为了完成此任务,首先在ServiceContract属性的帮助下创建一个接口类。为了在新创建的方法中启用事务,将其分配给TransactionFlow,并使用is Allowed值允许事务。

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

步骤3-使用TransactionScopeRequired属性实现WCF服务

通过使用下面显示的代码来完成-

[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服务配置文件启用事务流

它的编码如下-


   
      
   

至关重要的一点是,将事务允许的绑定与终结点附加在一起以公开WCF服务。


第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交易启用2