原文地址: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. memcached并发处理

    memcached(十八)并发原语CAS与GETS操作 Memcached 并发控制 CAS 协议 memcache控制高并发问题 使用memcached进行并发控制 memcached的最佳实践方案

  2. IIS 64位上發佈32位asp.net設置

    錯誤:無法載入檔案或組件 'Maticsoft.Web' 或其相依性的其中之一. 試圖載入格式錯誤的程式. 解決:新增應用程序池——高級設置——啟用32位應用程式——True

  3. Cacti优化之spine轮询器

    由于效率的原因,在需要大量采集数据时,如果使用自带的cmd.php轮询器会比较慢,1分钟1次的采集频率可能无法完成轮询所有的被监控的机器,从而可能导致部分监控项目不出图或图形断断续续.为了解决效率问题 ...

  4. SGU 128.Snake

    时间限制:0.25s 空间限制:4m 题意: 在一个平面坐标中有N个点,现在要你用这N个点构造一个闭合图形,这个图形要满足以下条件: 1.这个图形要是闭合的:          2.图形上的点只能是给 ...

  5. 【POJ3237】【树链剖分】Tree

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

  6. iOS 数据持久性存储-对象归档

    对象归档是将对象归档以文件的形式保存到磁盘中(也称为序列化,持久化),使用的时候读取该文件的保存路径读取文件的内容(也称为解档,反序列化) 主要涉及两个类:NSKeyedArichiver.NSKey ...

  7. wordpress整站搬家总结

    去年图便宜,也没准备认真写博文,所以花了几百元钱买了个国内空间(域名已经备案).购买了以后,放了一个wordpress博客,没事的时候写写博文,但从没有抽出时间去写,文章的质量也不追求.一开始还可以, ...

  8. 火狐无法访问本机IIS部署的网站,弹出:此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求 的解决办法

    关于火狐浏览器访问本机IIS部署的网站弹出“此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求”这个错误(错误截图如下): 解决方法如下: 1.打开火狐浏览器, ...

  9. string相关

    1.find相关 string s="abcd"; size_t pos0 = s.find_first_of("dcb");         1    //返 ...

  10. 我学C的那些年[ch01]:浅淡C语言的编译过程

    前几天大致学习了C语言的编译过程,那么今天就和大家分享一下 首先,编译C语言,需要一个文本编辑器(windows自带的也行),和一个MinGW编译器(需要配置环境),就可以将.c文件编译成.exe文件 ...