WCF分布事務(wù)保證數(shù)據(jù)完整性
我們作為一個開發(fā)人員,應該能夠順應技術(shù)的不斷發(fā)展,不斷的去掌握新技術(shù)。那么,對于WCF的掌握,就是其中一個非常重要的技能掌握。WCF分布事務(wù)提供了良好的支持,這使得我們可以協(xié)調(diào)多個服務(wù)之間的數(shù)據(jù)完整性。通過 TransactionFlowAttribute、ServiceBehaviorAttribute 和 OperationBehaviorAttribute 這三個特性,我們可以很好地控制事務(wù)的相關(guān)細節(jié)。#t#
TransactionFlowAttribute 的構(gòu)造參數(shù) "TransactionFlowOption transactions" 允許我們在強制事務(wù)(Mandatory)、允許參與事務(wù)(Allowed)和禁止事務(wù)(NotAllowed)間進行選擇。
ServiceBehaviorAttribute 提供了多個屬性參與事務(wù)控制。TransactionAutoCompleteOnSessionClose 指示當會話(Session)結(jié)束時是否自動提交事務(wù)(Complete); ReleaseServiceInstanceOnTransactionComplete 指示事務(wù)提交后是否釋放服務(wù)實例對象; TransactionIsolationLevel 用于設(shè)置事務(wù)隔離方式(isolation level); TransactionTimeout 用于設(shè)置事務(wù)超時時間。
OperationBehaviorAttribute 的 TransactionScopeRequired 屬性是 WCF分布事務(wù)所必需使用的,它表明服務(wù)方法必須在事務(wù)范圍(transaction scope)內(nèi)執(zhí)行。如果不添加該標記,則意味著服務(wù)方法不參與到事務(wù)中。TransactionAutoComplete 指示方法正常結(jié)束后自動提交事務(wù)。
上面這些特性屬性的使用有些特殊的細節(jié)要求,本文只是做個簡要的說明,有關(guān)更多內(nèi)容,請參考 MSDN 幫助文檔。
演示
下面的代碼中,我們使用新的程序域來模擬兩個服務(wù),客戶端通過 TransactionScope 來完成WCF分布事務(wù)調(diào)用。
步驟:
1. 使用 TransactionFlowAttribute 對契約方法進行標注,啟用事務(wù)。
2. 使用 OperationBehaviorAttribute 對服務(wù)方法進行標注,使用事務(wù)。
3. 將所有 Binding.TransactionFlow 設(shè)置為 true。
- [ServiceContract]
- public interface IContract
- {
- [OperationContract]
- [TransactionFlow(TransactionFlowOption.Mandatory)]
- void Test();
- }
- public class MyService : IContract
- {
- [OperationBehavior(TransactionScopeRequired=true)]
- public void Test()
- {
- string connStr = "Data Source=(local);Initial Catalog=tempdb;
Integrated Security=True";- using (SqlConnection conn = new SqlConnection(connStr))
- {
- conn.Open();
- SqlCommand cmd = conn.CreateCommand();
- cmd.CommandText = String.Format("insert into table{0}
([name]) values ('name1')",- AppDomain.CurrentDomain.FriendlyName == "Server1" ? "1" : "2");
- cmd.ExecuteNonQuery();
- }
- }
- }
- public class WcfTest
- {
- public static void Test()
- {
- AppDomain.CreateDomain("Server1").DoCallBack(delegate
- {
- WSHttpBinding binding = new WSHttpBinding();
- binding.TransactionFlow = true;
- ServiceHost host = new ServiceHost(typeof(MyService));
- host.AddServiceEndpoint(typeof(IContract), binding,
"http://localhost:8080/myservice");- host.Open();
- });
- AppDomain.CreateDomain("Server2").DoCallBack(delegate
- {
- WSHttpBinding binding = new WSHttpBinding();
- binding.TransactionFlow = true;
- ServiceHost host = new ServiceHost(typeof(MyService));
- host.AddServiceEndpoint(typeof(IContract), binding,
"http://localhost:8081/myservice");- host.Open();
- });
- WSHttpBinding bindingx = new WSHttpBinding();
- bindingx.TransactionFlow = true;
- ChannelFactory<IContract> factory = new
ChannelFactory<IContract>(bindingx,- "http://localhost:8080/myservice");
- IContract client = factory.CreateChannel();
- ChannelFactory<IContract> factory2 =
new ChannelFactory<IContract>(bindingx,- "http://localhost:8081/myservice");
- IContract client2 = factory2.CreateChannel();
- try
- {
- using (TransactionScope scope = new TransactionScope())
- {
- client.Test();
- //throw new Exception();
- client2.Test();
- scope.Complete();
- }
- }
- catch
- {
- }
- factory.Close();
- factory2.Close();
- }
- }
以上就是對WCF分布事務(wù)的相關(guān)介紹。