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事務,如下所述。
-
準備階段 - 在這個階段,事務管理器檢查是否所有的實體準備好提交的事務。
-
提交階段 - 在這個階段,實體的提交在現實中得到開始。
理解一個WCF事務的兩相的功能,讓我們看看下麵的圖。
啟用WCF事務處理
要成功地使一個WCF事務成功,需要遵循一係列的六個步,。必要的步驟如下所示。
步驟1:創建兩個WCF服務
在這方麵,最重要的一步是建立在WCF中兩個服務項目,參與到一個事務。數據庫事務將在這兩個服務的執行,並且應當理解,它們是如何被一個WCF事務統一。 WCFTransactions的web應用程序也被創建在單個事務範圍占用兩個創建的服務。
第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服務後,發生異常(被迫)。