zoukankan      html  css  js  c++  java
  • WCF分布式事务

    原文地址:http://developer.51cto.com/art/201002/185426.htm

    我们作为一个开发人员,应该能够顺应技术的不断发展,不断的去掌握新技术。那么,对于WCF的掌握,就是其中一个非常重要的技能掌握。WCF分布事务提供了良好的支持,这使得我们可以协调多个服务之间的数据完整性。通过 TransactionFlowAttribute、ServiceBehaviorAttribute 和 OperationBehaviorAttribute 这三个特性,我们可以很好地控制事务的相关细节。

    TransactionFlowAttribute 的构造参数 "TransactionFlowOption transactions" 允许我们在强制事务(Mandatory)、允许参与事务(Allowed)和禁止事务(NotAllowed)间进行选择。

    ServiceBehaviorAttribute 提供了多个属性参与事务控制。TransactionAutoCompleteOnSessionClose 指示当会话(Session)结束时是否自动提交事务(Complete); ReleaseServiceInstanceOnTransactionComplete 指示事务提交后是否释放服务实例对象; TransactionIsolationLevel 用于设置事务隔离方式(isolation level); TransactionTimeout 用于设置事务超时时间。

    OperationBehaviorAttribute 的 TransactionScopeRequired 属性是 WCF分布事务所必需使用的,它表明服务方法必须在事务范围(transaction scope)内执行。如果不添加该标记,则意味着服务方法不参与到事务中。TransactionAutoComplete 指示方法正常结束后自动提交事务。

    上面这些特性属性的使用有些特殊的细节要求,本文只是做个简要的说明,有关更多内容,请参考 MSDN 帮助文档。

    演示

    下面的代码中,我们使用新的程序域来模拟两个服务,客户端通过 TransactionScope 来完成WCF分布事务调用。

    步骤:

    1. 使用 TransactionFlowAttribute 对契约方法进行标注,启用事务。

    2. 使用 OperationBehaviorAttribute 对服务方法进行标注,使用事务。

    3. 将所有 Binding.TransactionFlow 设置为 true。

    1. [ServiceContract]  
    2. public interface IContract  
    3. {  
    4. [OperationContract]  
    5. [TransactionFlow(TransactionFlowOption.Mandatory)]  
    6. void Test();  
    7. }  
    8. public class MyService : IContract  
    9. {  
    10. [OperationBehavior(TransactionScopeRequired=true)]  
    11. public void Test()  
    12. {  
    13. string connStr = "Data Source=(local);Initial Catalog=tempdb;
      Integrated Security=True";  
    14. using (SqlConnection conn = new SqlConnection(connStr))  
    15. {  
    16. conn.Open();  
    17. SqlCommand cmd = conn.CreateCommand();  
    18. cmd.CommandText = String.Format("insert into table{0} 
      ([name]) values ('name1')",   
    19. AppDomain.CurrentDomain.FriendlyName == "Server1" ? "1" : "2");  
    20. cmd.ExecuteNonQuery();  
    21. }  
    22. }  
    23. }  
    24. public class WcfTest  
    25. {  
    26. public static void Test()  
    27. {  
    28. AppDomain.CreateDomain("Server1").DoCallBack(delegate  
    29. {  
    30. WSHttpBinding binding = new WSHttpBinding();  
    31. binding.TransactionFlow = true;  
    32. ServiceHost host = new ServiceHost(typeof(MyService));  
    33. host.AddServiceEndpoint(typeof(IContract), binding, 
      "http://localhost:8080/myservice");  
    34. host.Open();  
    35. });  
    36. AppDomain.CreateDomain("Server2").DoCallBack(delegate  
    37. {  
    38. WSHttpBinding binding = new WSHttpBinding();  
    39. binding.TransactionFlow = true;  
    40. ServiceHost host = new ServiceHost(typeof(MyService));  
    41. host.AddServiceEndpoint(typeof(IContract), binding, 
      "http://localhost:8081/myservice");  
    42. host.Open();  
    43. });  
    44. WSHttpBinding bindingx = new WSHttpBinding();  
    45. bindingx.TransactionFlow = true;  
    46. ChannelFactory<IContractfactory = new 
      ChannelFactory<IContract>(bindingx,   
    47. "http://localhost:8080/myservice");  
    48. IContract client = factory.CreateChannel();  
    49. ChannelFactory<IContractfactory2 = 
      new ChannelFactory<IContract>(bindingx,   
    50. "http://localhost:8081/myservice");  
    51. IContract client2 = factory2.CreateChannel();  
    52. try  
    53. {  
    54. using (TransactionScope scope = new TransactionScope())  
    55. {  
    56. client.Test();  
    57. //throw new Exception();  
    58. client2.Test();  
    59. scope.Complete();  
    60. }  
    61. }  
    62. catch  
    63. {  
    64. }  
    65. factory.Close();  
    66. factory2.Close();  
    67. }  

    以上就是对WCF分布事务的相关介绍。

  • 相关阅读:
    HDU 1166 敌兵布阵 (线段树 & 树状数组)
    HDU 1286 找新朋友 (欧拉函数)
    HDU 2203 亲和串 (KMP)
    HDU 1394 Minimum Inversion Number (归并排序 | 线段树 | 数状数组)
    HDU Leftmost Digit
    POJ 1195 Mobile phones
    C# 用jquery多个文件上传
    Ajax.NET Professional csharp DropDownList两级联无刷新绑定
    C# 公农历算法 ChineseLunisolarCalendar的一点思路
    csharp webform Button控件OnClick,OnClientClick事件
  • 原文地址:https://www.cnblogs.com/niaowo/p/4707749.html
Copyright © 2011-2022 走看看