原文地址: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. 学习java随笔第一篇:搭建java平台(java se)

    电脑系统:windows8 在这里介绍一下java平台的3个版本: Java SE--Java Standard Edition,Java的标准版,主要用于桌面级的应用和数据库开发. Java EE- ...

  2. [转帖]vivado & VS2013工具

    来源:http://bbs.csdn.net/topics/380057699 添加OpenCV库后,MFC在Debug模式下调试,提示应用程序无法正常启动(0xc000007b). 解决方法:在环境 ...

  3. Linux命令:cat命令详解

    概述:查看文件内容,连接文件,重定向输出到文件 1.查看整个文件 2.cat > filename 创建文件 3.合并输出到文件 1.查看文件(单个或者多个) cat demo.txt 2.创建 ...

  4. Sqoop import加载HBase过程中,遇到Permission denied: user=root, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x

    在执行hbase sqoop抽取的时候,遇到了一个错误,如下图: 在执行程序的过程中,遇到权限问题很正常,也容易让人防不胜防,有问题就想办法解决,这个是关键. 解决办法如下: 第一步:su hdfs, ...

  5. 封装Timer

    System.Timers.Timer,System.Timers.Timer在使用的过程中需要: 1.构造函数不同,构造函数可以什么事情也不做,也可以传入响应间隔时间:System.Timers.T ...

  6. JqGrid自定义toolbar

    1.设置toolbar参数为[true,"top"],其意思是toolbar显示在Grid顶部,且其id为t_+Grid的id.e.g.: Grid的id为myGrid,toolb ...

  7. PHP-HTML重要知识点笔记

    1.用frameset.frame和iframe还实现多窗口 2.在图片上利用映射距离usemap来实现按钮跳转.------第8尾集 3.表单必须要有name和value,因为抓包的时候,可发现必须 ...

  8. dedecms织梦二级菜单的实现方法

    首先,复制代码: 程序代码 {dede:channelartlist typeid='top' cacheid='channelsonlist'} {dede:channel type='son' n ...

  9. CSS3 box-shadow(阴影使用)

    from: http://jingyan.baidu.com/article/03b2f78c4d9fae5ea237aea6.html css3 box-shadow 内阴影与外阴影 1- box- ...

  10. Python自动化运维之23、Dom

    文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.最为关心的是,DOM把网页 ...