原文地址: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<IContract> factory = new 
    ChannelFactory<IContract>(bindingx,
  47. "http://localhost:8080/myservice");
  48. IContract client = factory.CreateChannel();
  49. ChannelFactory<IContract> factory2 = 
    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. }
  68. }

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

WCF分布式事务的更多相关文章

  1. WCF分布式事务(EF)

    才说分布式事务,首先,了解一下什么是交易. 事务有四个特性:ACID A是Atomicity,原子性.一个事务往往涉及到很多的子操作,原子性则保证这些子操作要么都做,要么都不做,而不至于出现事务的部分 ...

  2. [转载]WCF系列_分布式事务(下)

    浏览到chnking的WCF的分布式事务处理不错,转载过来分享一下. 1. WCF分布式事务例子这里也用转账的例子说事.用户在系统A和系统B都有账户,账户间的资金可以互转,系统A的资金减少多少,系统B ...

  3. WCF(三)分布式事务

    最近在学WCF,所以有两个设想疑问(菜鸟多疑问): 如果有WCF服务A,WCF服务B,客户端调用WCF服务A插入一条数据,然后再调用服务B也插入一条数据,然而服务B出错了进行了回滚,服务A能不能也进行 ...

  4. WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程

    今天我们继续学习WCF分布式开发步步为赢系列的12节:WCF事务机制(Transaction)和分布式事务编程.众所周知,应用系统开发过程中,事务是一个重要的概念.它是保证数据与服务可靠性的重要机制. ...

  5. WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发

    .Net Remoting的激活方式也有三种:SingleTon模式.SingleCall模式.客户端激活方式,WCF服务实例激活类型包括三种方式:单调服务(Call Service),会话服务(Se ...

  6. 【WCF--初入江湖】07 分布式事务

    07 分布式事务 一.前言 [1]理解事务特性 [2]掌握TransactionFlow 特性 [3]掌握WCF中的事务属性 TransactionAutoCompleteOnSessionClose ...

  7. 谈谈分布式事务之三: System.Transactions事务详解[上篇]

    在.NET 1.x中,我们基本是通过ADO.NET实现对不同数据库访问的事务..NET 2.0为了带来了全新的事务编程模式,由于所有事务组件或者类型均定义在System.Transactions程序集 ...

  8. 谈谈分布式事务之二:基于DTC的分布式事务管理模型[下篇]

    [续上篇] 当基于LTM或者KTM的事务提升到基于DTC的分布式事务后,DTC成为了本机所有事务型资源管理器的管理者:此外,当一个事务型操作超出了本机的范 围,出现了跨机器的调用后,本机的DTC需要于 ...

  9. Nginx集群之WCF分布式身份验证(支持Soap)

    目录 1       大概思路... 1 2       Nginx集群之WCF分布式身份验证... 1 3       BasicHttpBinding.ws2007HttpBinding. 2 4 ...

随机推荐

  1. $(this).next()与$(this).children()

    $(this).next() 当前元素同级的下个元素,而非子元素 $(this).children() 是当前元素的下一级元素的集合,就是子元素的集合,而不管子元素的后代元素 所以这两个没有什么可比性 ...

  2. IK分词算法设计总结

    IK分词算法设计思考 加载词典 IK分词算法初始化时加载了“敏感词”.“主词典”.“停词”.“量词”,如果这些词语的数量很多,怎么保证加载的时候内存不溢出 分词缓冲区 在分词缓冲区中进行分词操作,怎么 ...

  3. Oracle dblink的创建及使用

    在工作中遇到的情况简单说下: --首先要赋予用户创建dblink的权限.grant resource to ods_nwsc;grant create database link to ods_nws ...

  4. ActionScript:Resampling PCM data

    使用基于flash的麦克风录音,如果想在获取完PCM采样数据后,通过Sound马上回放,必须经过resampling.(注意:如果录音是采用的44KHz的话,则不需要) 因此,需要as实现一个简便的函 ...

  5. 查询Sqlserver数据库死锁的一个存储过程(转)

        使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁, 死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉.利用sp_who ...

  6. AngularJS+NodeJS环境搭建

    需要安装的软件: node-v0.12.7-x64.msi python-2.7.10.amd64.msi Git-2.5.1-64-bit.exe (注意:Git安装时,需要选择的步骤)  安装位置 ...

  7. (java)从零开始之--观察者设计模式Observer

    观察者设计模式:时当一个对象发生指定的动作时,要通过另外的对象做出相应的处理. 步骤: 1. A对象发生指定的动作是,要通知B,C,D...对象做出相应的处理,这时候应该把B,C,D...对象针对A对 ...

  8. hash表的建立和查找

    (1)冲突处理方法为:顺次循环后移到下一个位置,寻找空位插入.(2)BKDE 字符串哈希unsigned int hash_BKDE(char *str){/* 初始种子seed 可取31 131 1 ...

  9. 寻找链表中倒数第K个结点的位置

    输入一个链表,输出该链表中倒数第K个结点. struct ListNode { int m_nValue; ListNode* m_pNext; }; ListNode* FindKthToTail( ...

  10. SGU 157.Patience

    简单的搜索,在n>10时,要打表 code: #include<stdio.h> #include<string.h> #include<algorithm> ...