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

深入分析WCF事務投票實現方式

開發 開發工具
WCF事務投票的實現方法是一個比較簡單但是在實際應用中又非常重要的一個操作技術。在這里我們將會和大家一起解讀這一技術的具體應用。

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

我們將服務方法默認的 TransactionAutoComplete=true 改為 false,看看結果 。

  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. }  

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

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

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

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

  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. }  

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

以上就是我們為大家介紹的WCF事務投票的相關實現方法。

【編輯推薦】

  1. WCF MSMQ隊列基本概念簡述
  2. PDA訪問WCF實現重點在過程
  3. WCF標準終結點基本概念剖析
  4. WCF回調操作是雞應用技巧講解
  5. WCF元數據交換應用技巧分享
責任編輯:曹凱 來源: 豆豆網
相關推薦

2021-03-17 00:05:50

分布式事務提交

2010-09-07 14:21:22

PPPoE協議

2022-04-12 08:30:45

TomcatWeb 應用Servlet

2011-03-23 11:01:55

LAMP 架構

2010-03-05 13:38:13

Python數據轉換

2023-02-01 08:13:30

Redis內存碎片

2011-09-01 13:51:52

JavaScript

2010-03-08 14:53:48

Linux分區

2010-01-08 16:58:49

網管交換機

2009-12-16 16:39:01

Visual Stud

2009-06-10 18:12:38

Equinox動態化OSGi動態化

2022-08-30 07:00:18

執行引擎Hotspot虛擬機

2009-12-14 14:50:46

Ruby傳參數

2021-10-29 16:36:53

AMSAndroidActivityMan

2015-08-03 09:54:26

Java線程Java

2018-10-25 15:24:10

ThreadLocal內存泄漏Java

2018-12-18 10:11:37

軟件復雜度軟件系統軟件開發

2021-04-13 12:55:06

SpringMVC解析器接口

2023-08-07 07:44:44

2020-12-07 06:23:48

Java內存
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 五月婷六月丁香 | 亚洲aⅴ | 国产一区二区三区在线视频 | 性生生活大片免费看视频 | 国产精品久久午夜夜伦鲁鲁 | 亚州精品天堂中文字幕 | 99久久99 | www.99热.com | 亚洲精品久久久蜜桃网站 | 国产精品免费一区二区三区四区 | 国产成人精品一区二 | 亚洲成人在线免费 | 亚洲欧洲精品成人久久奇米网 | 鸳鸯谱在线观看高清 | 国产精品久久久久久久久久免费看 | 欧美一区二区三区视频 | 久久成人一区 | 黑人精品欧美一区二区蜜桃 | 午夜小视频免费观看 | 91久久精品国产91久久性色tv | 国产高清在线视频 | 久久精品视频在线播放 | 欧美在线a | 中午字幕在线观看 | 男人的天堂中文字幕 | 亚洲精品成人 | 91精品国产综合久久久久久 | 日韩免费中文字幕 | 久久精品一区二区 | 日日干天天操 | 欧美性久久久 | 国产在线看片 | 欧美日韩久久精品 | 国产精品国产精品国产专区不片 | 伊人精品一区二区三区 | 日日夜夜草| 日韩欧美在线免费观看 | 四虎影院免费在线 | 在线欧美一区二区 | 亚洲 欧美 综合 | 日韩看片 |