WCF事務


事務處理在WCF(Windows Communication Foundation)是一套遵循一些性質,統稱為ACID的操作。這裡,如果一個操作出現故障,整個系統就會自動失敗。如網上訂單生成,就可能使用事務。下面的例子可以幫助理解事務的過程中更簡單的術語。

例子

假設一台液晶電視是您從線上商店訂購,你會通過信用卡支付的金額。當輸入必要的資訊來下訂單,同時出現兩個操作。一個特定的量被從您的銀行賬戶中扣除,第二是供應商貸記相同。兩個操作必須以有一個成功的事務成功執行。

WCF事務屬性

WCF事務有以下的四個屬性。

  • 原子性 – 所有的操作都必須作為在完成一個事務的一個不可分割的操作。

  • 一致性 – 無論是什麼操作設定,系統始終處於的狀態總是按照預期的,即事務的結果一致性。

  • 隔離性 – 系統的中間狀態是不可見的外部世界的任何實體,直到交易完成。

  • 永續性 – 提交狀態保持無論任何形式的故障(硬體,停電等)。

在組態一個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使用三種協定事務,這些都是輕量級,舊事務和WS-原子事務(WS-AT)。WS-AT是一種可互操作協定,可以跨防火牆的流量分散式事務。然而,該協定不應當事務是嚴格基於微軟技術使用。

WCF事務階段

有兩個階段一個WCF事務,如下所述。

Phases of WCF Transaction
  • 準備階段 - 在這個階段,事務管理器檢查是否所有的實體準備好提交的事務。

  • 提交階段 - 在這個階段,實體的提交在現實中得到開始。

理解一個WCF事務的兩相的功能,讓我們看看下面的圖。

Phases of WCF Transaction

啟用WCF事務處理

要成功地使一個WCF事務成功,需要遵循一系列的六個步,。必要的步驟如下所示。

步驟1:建立兩個WCF服務

在這方面,最重要的一步是建立在WCF中兩個服務專案,參與到一個事務。資料庫事務將在這兩個服務的執行,並且應當理解,它們是如何被一個WCF事務統一。 WCFTransactions的web應用程式也被建立在單個事務範圍佔用兩個建立的服務。

Enabling WCF Transaction

第2步:建立方法並且其屬性有TransactionFlow屬性

這裡,UpdateData方法將被建立為將WCF服務插入到具有OperationContract特性的資料庫。為了完成這個任務,介面類ServiceContract首先建立。用於實現該事務在新建立的方法,它具有TransactionFlow屬性和事務都使用相同的值。

[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物件用於這兩個服務。上述物件的完整方法被呼叫來提交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 = new ServiceReference1.Service1Client();
     obj.UpdateData();
     ServiceReference2.Service1Client obj1 = new ServiceReference2.Service1Client();
     obj1.UpdateData();
     ts.Complete();
  }
  catch (Exception ex)
  {
     ts.Dispose();
  }
}

第6步:測試WCF事務

測試是在第6步,也是最後一步並呼叫第1個WCF服務後,發生異常(被迫)。

Enabling WCF Transaction