WCF分布事務(wù)保證數(shù)據(jù)完整性
我們作為一個(gè)開發(fā)人員,應(yīng)該能夠順應(yīng)技術(shù)的不斷發(fā)展,不斷的去掌握新技術(shù)。那么,對(duì)于WCF的掌握,就是其中一個(gè)非常重要的技能掌握。WCF分布事務(wù)提供了良好的支持,這使得我們可以協(xié)調(diào)多個(gè)服務(wù)之間的數(shù)據(jù)完整性。通過 TransactionFlowAttribute、ServiceBehaviorAttribute 和 OperationBehaviorAttribute 這三個(gè)特性,我們可以很好地控制事務(wù)的相關(guān)細(xì)節(jié)。#t#
TransactionFlowAttribute 的構(gòu)造參數(shù) "TransactionFlowOption transactions" 允許我們?cè)趶?qiáng)制事務(wù)(Mandatory)、允許參與事務(wù)(Allowed)和禁止事務(wù)(NotAllowed)間進(jìn)行選擇。
ServiceBehaviorAttribute 提供了多個(gè)屬性參與事務(wù)控制。TransactionAutoCompleteOnSessionClose 指示當(dāng)會(huì)話(Session)結(jié)束時(shí)是否自動(dòng)提交事務(wù)(Complete); ReleaseServiceInstanceOnTransactionComplete 指示事務(wù)提交后是否釋放服務(wù)實(shí)例對(duì)象; TransactionIsolationLevel 用于設(shè)置事務(wù)隔離方式(isolation level); TransactionTimeout 用于設(shè)置事務(wù)超時(shí)時(shí)間。
OperationBehaviorAttribute 的 TransactionScopeRequired 屬性是 WCF分布事務(wù)所必需使用的,它表明服務(wù)方法必須在事務(wù)范圍(transaction scope)內(nèi)執(zhí)行。如果不添加該標(biāo)記,則意味著服務(wù)方法不參與到事務(wù)中。TransactionAutoComplete 指示方法正常結(jié)束后自動(dòng)提交事務(wù)。
上面這些特性屬性的使用有些特殊的細(xì)節(jié)要求,本文只是做個(gè)簡(jiǎn)要的說明,有關(guān)更多內(nèi)容,請(qǐng)參考 MSDN 幫助文檔。
演示
下面的代碼中,我們使用新的程序域來模擬兩個(gè)服務(wù),客戶端通過 TransactionScope 來完成WCF分布事務(wù)調(diào)用。
步驟:
1. 使用 TransactionFlowAttribute 對(duì)契約方法進(jìn)行標(biāo)注,啟用事務(wù)。
2. 使用 OperationBehaviorAttribute 對(duì)服務(wù)方法進(jìn)行標(biāo)注,使用事務(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();
- }
- }
以上就是對(duì)WCF分布事務(wù)的相關(guān)介紹。





























