成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入分析WCF事務(wù)投票實現(xiàn)方式

開發(fā) 開發(fā)工具
WCF事務(wù)投票的實現(xiàn)方法是一個比較簡單但是在實際應(yīng)用中又非常重要的一個操作技術(shù)。在這里我們將會和大家一起解讀這一技術(shù)的具體應(yīng)用。

我們知道事務(wù)是通過參與方進(jìn)行WCF事務(wù)投票(Voting)來決定 "提交(Complete)" 或者 "回滾(Rollback)" 操作的。默認(rèn)情況下,WCF 通過 OperationBehavior(TransactionAutoComplete = true) 來完成投票動作。(TransactionAutoComplete = true 是缺省值,不需要顯式聲明。)

我們將服務(wù)方法默認(rèn)的 TransactionAutoComplete=true 改為 false,看看結(jié)果 。

  1. // ---- Service1 -----  
  2. [ServiceContract(SessionModeSessionMode=SessionMode.Required)]  
  3. public interface IService1  
  4. {  
  5. [OperationContract]  
  6. [TransactionFlow(TransactionFlowOption.Allowed)]  
  7. void Test();  
  8. }  
  9. public class MyService1 : IService1  
  10. {  
  11. [OperationBehavior(TransactionScopeRequired=true, 
    TransactionAutoComplete=false)]  
  12. public void Test()  
  13. {  
  14. string connStr = "server=(local);uid=sa;pwd=sa;database=temp";  
  15. using (SqlConnection conn = new SqlConnection(connStr))  
  16. {  
  17. conn.Open();  
  18. SqlCommand cmd = new SqlCommand("insert into [User] 
    ([name]) values (@name)",   
  19. conn);  
  20. cmd.Parameters.Add(new SqlParameter("@name", "ZhangSan"));  
  21. cmd.ExecuteNonQuery();  
  22. }  
  23. }  
  24. }  
  25. // ---- Service2 -----  
  26. [ServiceContract(SessionMode = SessionMode.Required)]  
  27. public interface IService2  
  28. {  
  29. [OperationContract]  
  30. [TransactionFlow(TransactionFlowOption.Allowed)]  
  31. void Test();  
  32. }  
  33. public class MyService2 : IService2  
  34. {  
  35. [OperationBehavior(TransactionScopeRequired = true, 
    TransactionAutoComplete = false)]  
  36. public void Test()  
  37. {  
  38. string connStr = "server=(local);uid=sa;pwd=sa;database=temp";  
  39. using (SqlConnection conn = new SqlConnection(connStr))  
  40. {  
  41. conn.Open();  
  42. SqlCommand cmd = new SqlCommand("insert into Account ([user], 
    [money]) values (@user, @money)",   
  43. conn);  
  44. cmd.Parameters.Add(new SqlParameter("@user", "ZhangSan"));  
  45. cmd.Parameters.Add(new SqlParameter("@money", 100));  
  46. cmd.ExecuteNonQuery();  
  47. }  
  48. }  
  49. }  
  50. public class WcfTest  
  51. {  
  52. public static void Test()  
  53. {  
  54. // ---- Host -----  
  55. AppDomain.CreateDomain("Server").DoCallBack(delegate  
  56. {  
  57. NetTcpBinding bindingServer = new NetTcpBinding();  
  58. bindingServer.TransactionFlow = true;  
  59. ServiceHost host1 = new ServiceHost(typeof(MyService1), 
    new Uri("net.tcp://localhost:8080"));  
  60. host1.AddServiceEndpoint(typeof(IService1), bindingServer, "");  
  61. host1.Open();  
  62. ServiceHost host2 = new ServiceHost(typeof(MyService2), 
    new Uri("net.tcp://localhost:8081"));  
  63. host2.AddServiceEndpoint(typeof(IService2), bindingServer, "");  
  64. host2.Open();  
  65. });  
  66. // ---- Client -----  
  67. NetTcpBinding bindingClient = new NetTcpBinding();  
  68. bindingClient.TransactionFlow = true;  
  69. IService1 client1 = ChannelFactory<IService1>.CreateChannel(bindingClient,   
  70. new EndpointAddress("net.tcp://localhost:8080"));  
  71. IService2 client2 = ChannelFactory<IService2>.CreateChannel(bindingClient,   
  72. new EndpointAddress("net.tcp://localhost:8081"));  
  73. using (TransactionScope scope = new TransactionScope())  
  74. {  
  75. try  
  76. {  
  77. client1.Test();  
  78. client2.Test();  
  79. scope.Complete();  
  80. }  
  81. finally  
  82. {  
  83. (client1 as IDisposable).Dispose();  
  84. (client2 as IDisposable).Dispose();  
  85. }  
  86. }  
  87. }  

運行結(jié)果表明事務(wù)無法提交,觸發(fā) TransactionAbortedException 異常,顯示 "事務(wù)終止"。那么除了默認(rèn)被稱之為 "聲明投票(Declarative voting)" 的方式外,我們還能怎么做?OperationContext 有個 SetTransactionComplete() 方法,允許我們在代碼中完成WCF事務(wù)投票行為。這種投票方式更加靈活,便于我們在代碼中做出更多的控制,被稱之為 "顯式投票(Explicit voting)"。

在上面兩個 Test() 方法的***一行,添加 "OperationContext.Current.SetTransactionComplete();",再次運行,事務(wù)被正確提交。

  1. [OperationBehavior(TransactionScopeRequired=true, 
    TransactionAutoComplete=false)]  
  2. public void Test()  
  3. {  
  4. // ...  
  5. OperationContext.Current.SetTransactionComplete();  
  6. }   
  7. ... 

接下來,我們設(shè)想另外一種情況。事務(wù)不由 Client 發(fā)起,在 Service1.Test() 調(diào)用 Service2.Test(),那么事務(wù)會是個什么樣子呢?Service1、Service2 的參數(shù) "OperationBehavior(TransactionScopeRequired = true)" 決定了如果沒有外界傳入的環(huán)境事務(wù),那么會自動創(chuàng)建一個根事務(wù)。所以 Service1.Test() 會創(chuàng)建一個根事務(wù),而 Service2.Test() 會參與這個事務(wù)。可問題在于 Service.Test() 中并沒有顯示調(diào)用 Transaction.Complete,事務(wù)能被提交嗎?

  1. // ---- Service1 -----  
  2. [ServiceContract]  
  3. public interface IService1  
  4. {  
  5. [OperationContract]  
  6. [TransactionFlow(TransactionFlowOption.Allowed)]  
  7. void Test();  
  8. }  
  9. public class MyService1 : IService1  
  10. {  
  11. [OperationBehavior(TransactionScopeRequired=true)]  
  12. public void Test()  
  13. {  
  14. string connStr = "server=(local);uid=sa;pwd=sa;database=temp";  
  15. using (SqlConnection conn = new SqlConnection(connStr))  
  16. {  
  17. conn.Open();  
  18. SqlCommand cmd = new SqlCommand("insert into [User] 
    ([name]) values (@name)",   
  19. conn);  
  20. cmd.Parameters.Add(new SqlParameter("@name", "ZhangSan"));  
  21. cmd.ExecuteNonQuery();  
  22. }  
  23. InvokeService2();  
  24. }  
  25. public void InvokeService2()  
  26. {  
  27. NetTcpBinding bindingClient = new NetTcpBinding();  
  28. bindingClient.TransactionFlow = true;  
  29. IService2 client2 = ChannelFactory<IService2>.CreateChannel
    (bindingClient,   
  30. new EndpointAddress("net.tcp://localhost:8081"));  
  31. using (client2 as IDisposable)  
  32. {  
  33. client2.Test();  
  34. }  
  35. }  
  36. }  
  37. // ---- Service2 -----  
  38. [ServiceContract]  
  39. public interface IService2  
  40. {  
  41. [OperationContract]  
  42. [TransactionFlow(TransactionFlowOption.Allowed)]  
  43. void Test();  
  44. }  
  45. public class MyService2 : IService2  
  46. {  
  47. [OperationBehavior(TransactionScopeRequired = true)]  
  48. public void Test()  
  49. {  
  50. string connStr = "server=(local);uid=sa;pwd=sa;database=temp";  
  51. using (SqlConnection conn = new SqlConnection(connStr))  
  52. {  
  53. conn.Open();  
  54. SqlCommand cmd = new SqlCommand("insert into Account 
    ([user], [money]) values (@user, @money)",   
  55. conn);  
  56. cmd.Parameters.Add(new SqlParameter("@user", "ZhangSan"));  
  57. cmd.Parameters.Add(new SqlParameter("@money", 100));  
  58. cmd.ExecuteNonQuery();  
  59. }  
  60. }  
  61. }  
  62. public class WcfTest  
  63. {  
  64. public static void Test()  
  65. {  
  66. // ---- Host -----  
  67. AppDomain.CreateDomain("Server").DoCallBack(delegate  
  68. {  
  69. NetTcpBinding bindingServer = new NetTcpBinding();  
  70. bindingServer.TransactionFlow = true;  
  71. ServiceHost host1 = new ServiceHost(typeof(MyService1), 
    new Uri("net.tcp://localhost:8080"));  
  72. host1.AddServiceEndpoint(typeof(IService1), bindingServer, "");  
  73. host1.Open();  
  74. ServiceHost host2 = new ServiceHost(typeof(MyService2), 
    new Uri("net.tcp://localhost:8081"));  
  75. host2.AddServiceEndpoint(typeof(IService2), bindingServer, "");  
  76. host2.Open();  
  77. });  
  78. // ---- Client -----  
  79. NetTcpBinding bindingClient = new NetTcpBinding();  
  80. bindingClient.TransactionFlow = true;  
  81. IService1 client1 = ChannelFactory<IService1>.CreateChannel
    (bindingClient,   
  82. new EndpointAddress("net.tcp://localhost:8080"));  
  83. try  
  84. {  
  85. client1.Test();  
  86. }  
  87. finally  
  88. {  
  89. (client1 as IDisposable).Dispose();  
  90. }  
  91. }  

運行結(jié)果表明,事務(wù)被正確提交。看來這和客戶端使用 TransactionScope 必須顯式調(diào)用 Complete() 有所不同。同樣,如果將 Service2.Test() 設(shè)為 TransactionAutoComplete=false,在不調(diào)用 "OperationContext.Current.SetTransactionComplete();" 的情況下,也會觸發(fā)事務(wù)失敗異常。

以上就是我們?yōu)榇蠹医榻B的WCF事務(wù)投票的相關(guān)實現(xiàn)方法。

【編輯推薦】

  1. WCF MSMQ隊列基本概念簡述
  2. PDA訪問WCF實現(xiàn)重點在過程
  3. WCF標(biāo)準(zhǔn)終結(jié)點基本概念剖析
  4. WCF回調(diào)操作是雞應(yīng)用技巧講解
  5. WCF元數(shù)據(jù)交換應(yīng)用技巧分享
責(zé)任編輯:曹凱 來源: 豆豆網(wǎng)
相關(guān)推薦

2021-03-17 00:05:50

分布式事務(wù)提交

2010-09-07 14:21:22

PPPoE協(xié)議

2022-04-12 08:30:45

TomcatWeb 應(yīng)用Servlet

2011-03-23 11:01:55

LAMP 架構(gòu)

2010-03-05 13:38:13

Python數(shù)據(jù)轉(zhuǎn)換

2010-03-08 14:53:48

Linux分區(qū)

2023-02-01 08:13:30

Redis內(nèi)存碎片

2011-09-01 13:51:52

JavaScript

2010-01-08 16:58:49

網(wǎng)管交換機(jī)

2009-12-16 16:39:01

Visual Stud

2009-06-10 18:12:38

Equinox動態(tài)化OSGi動態(tài)化

2022-08-30 07:00:18

執(zhí)行引擎Hotspot虛擬機(jī)

2009-12-14 14:50:46

Ruby傳參數(shù)

2021-10-29 16:36:53

AMSAndroidActivityMan

2015-08-03 09:54:26

Java線程Java

2018-10-25 15:24:10

ThreadLocal內(nèi)存泄漏Java

2018-12-18 10:11:37

軟件復(fù)雜度軟件系統(tǒng)軟件開發(fā)

2021-04-13 12:55:06

SpringMVC解析器接口

2023-08-07 07:44:44

2011-09-13 09:08:22

架構(gòu)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久国产日韩欧美 | 亚洲在线视频 | 日日夜夜精品视频 | 国产精品国色综合久久 | 国产乱码精品一区二区三区av | 五月网婷婷| 999国产视频 | 亚洲精品一区二三区不卡 | 色视频成人在线观看免 | 精品国产精品一区二区夜夜嗨 | 亚洲五码在线 | 亚洲狠狠丁香婷婷综合久久久 | 色资源在线视频 | 超碰在线播 | 国产精品久久国产精品 | 久久精品a级毛片 | 亚洲精品欧美精品 | 久久这里只有精品首页 | 午夜精 | 九九热精品视频 | 国产综合欧美 | 国产麻豆一区二区三区 | 久久免费国产 | 91在线视频免费观看 | 欧美激情a∨在线视频播放 成人免费共享视频 | 国产真实精品久久二三区 | 一区二区三区在线免费看 | 久久久久久91香蕉国产 | 91亚洲精| 午夜一区 | 欧美在线一区二区三区 | 瑞克和莫蒂第五季在线观看 | av黄色在线| 天堂三级| 国产成人在线一区二区 | 亚洲国产精久久久久久久 | 亚洲区一区二 | 精品视频在线播放 | 超碰在线免费公开 | 黄色av网站在线免费观看 | 国产欧美日韩一区二区三区 |