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。
- [ServiceContract]
- public interface IContract
- {
- [OperationContract]
- [TransactionFlow(TransactionFlowOption.Mandatory)]
- void Test();
- }
- public class MyService : IContract
- {
- [OperationBehavior(TransactionScopeRequired=true)]
- public void Test()
- {
- string connStr = "Data Source=(local);Initial Catalog=tempdb;
Integrated Security=True"; - using (SqlConnection conn = new SqlConnection(connStr))
- {
- conn.Open();
- SqlCommand cmd = conn.CreateCommand();
- cmd.CommandText = String.Format("insert into table{0}
([name]) values ('name1')", - AppDomain.CurrentDomain.FriendlyName == "Server1" ? "1" : "2");
- cmd.ExecuteNonQuery();
- }
- }
- }
- public class WcfTest
- {
- public static void Test()
- {
- AppDomain.CreateDomain("Server1").DoCallBack(delegate
- {
- WSHttpBinding binding = new WSHttpBinding();
- binding.TransactionFlow = true;
- ServiceHost host = new ServiceHost(typeof(MyService));
- host.AddServiceEndpoint(typeof(IContract), binding,
"http://localhost:8080/myservice"); - host.Open();
- });
- AppDomain.CreateDomain("Server2").DoCallBack(delegate
- {
- WSHttpBinding binding = new WSHttpBinding();
- binding.TransactionFlow = true;
- ServiceHost host = new ServiceHost(typeof(MyService));
- host.AddServiceEndpoint(typeof(IContract), binding,
"http://localhost:8081/myservice"); - host.Open();
- });
- WSHttpBinding bindingx = new WSHttpBinding();
- bindingx.TransactionFlow = true;
- ChannelFactory<IContract> factory = new
ChannelFactory<IContract>(bindingx, - "http://localhost:8080/myservice");
- IContract client = factory.CreateChannel();
- ChannelFactory<IContract> factory2 =
new ChannelFactory<IContract>(bindingx, - "http://localhost:8081/myservice");
- IContract client2 = factory2.CreateChannel();
- try
- {
- using (TransactionScope scope = new TransactionScope())
- {
- client.Test();
- //throw new Exception();
- client2.Test();
- scope.Complete();
- }
- }
- catch
- {
- }
- factory.Close();
- factory2.Close();
- }
- }
以上就是对WCF分布事务的相关介绍。
WCF分布式事务的更多相关文章
- WCF分布式事务(EF)
才说分布式事务,首先,了解一下什么是交易. 事务有四个特性:ACID A是Atomicity,原子性.一个事务往往涉及到很多的子操作,原子性则保证这些子操作要么都做,要么都不做,而不至于出现事务的部分 ...
- [转载]WCF系列_分布式事务(下)
浏览到chnking的WCF的分布式事务处理不错,转载过来分享一下. 1. WCF分布式事务例子这里也用转账的例子说事.用户在系统A和系统B都有账户,账户间的资金可以互转,系统A的资金减少多少,系统B ...
- WCF(三)分布式事务
最近在学WCF,所以有两个设想疑问(菜鸟多疑问): 如果有WCF服务A,WCF服务B,客户端调用WCF服务A插入一条数据,然后再调用服务B也插入一条数据,然而服务B出错了进行了回滚,服务A能不能也进行 ...
- WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程
今天我们继续学习WCF分布式开发步步为赢系列的12节:WCF事务机制(Transaction)和分布式事务编程.众所周知,应用系统开发过程中,事务是一个重要的概念.它是保证数据与服务可靠性的重要机制. ...
- WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发
.Net Remoting的激活方式也有三种:SingleTon模式.SingleCall模式.客户端激活方式,WCF服务实例激活类型包括三种方式:单调服务(Call Service),会话服务(Se ...
- 【WCF--初入江湖】07 分布式事务
07 分布式事务 一.前言 [1]理解事务特性 [2]掌握TransactionFlow 特性 [3]掌握WCF中的事务属性 TransactionAutoCompleteOnSessionClose ...
- 谈谈分布式事务之三: System.Transactions事务详解[上篇]
在.NET 1.x中,我们基本是通过ADO.NET实现对不同数据库访问的事务..NET 2.0为了带来了全新的事务编程模式,由于所有事务组件或者类型均定义在System.Transactions程序集 ...
- 谈谈分布式事务之二:基于DTC的分布式事务管理模型[下篇]
[续上篇] 当基于LTM或者KTM的事务提升到基于DTC的分布式事务后,DTC成为了本机所有事务型资源管理器的管理者:此外,当一个事务型操作超出了本机的范 围,出现了跨机器的调用后,本机的DTC需要于 ...
- Nginx集群之WCF分布式身份验证(支持Soap)
目录 1 大概思路... 1 2 Nginx集群之WCF分布式身份验证... 1 3 BasicHttpBinding.ws2007HttpBinding. 2 4 ...
随机推荐
- 学习java随笔第一篇:搭建java平台(java se)
电脑系统:windows8 在这里介绍一下java平台的3个版本: Java SE--Java Standard Edition,Java的标准版,主要用于桌面级的应用和数据库开发. Java EE- ...
- [转帖]vivado & VS2013工具
来源:http://bbs.csdn.net/topics/380057699 添加OpenCV库后,MFC在Debug模式下调试,提示应用程序无法正常启动(0xc000007b). 解决方法:在环境 ...
- Linux命令:cat命令详解
概述:查看文件内容,连接文件,重定向输出到文件 1.查看整个文件 2.cat > filename 创建文件 3.合并输出到文件 1.查看文件(单个或者多个) cat demo.txt 2.创建 ...
- Sqoop import加载HBase过程中,遇到Permission denied: user=root, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x
在执行hbase sqoop抽取的时候,遇到了一个错误,如下图: 在执行程序的过程中,遇到权限问题很正常,也容易让人防不胜防,有问题就想办法解决,这个是关键. 解决办法如下: 第一步:su hdfs, ...
- 封装Timer
System.Timers.Timer,System.Timers.Timer在使用的过程中需要: 1.构造函数不同,构造函数可以什么事情也不做,也可以传入响应间隔时间:System.Timers.T ...
- JqGrid自定义toolbar
1.设置toolbar参数为[true,"top"],其意思是toolbar显示在Grid顶部,且其id为t_+Grid的id.e.g.: Grid的id为myGrid,toolb ...
- PHP-HTML重要知识点笔记
1.用frameset.frame和iframe还实现多窗口 2.在图片上利用映射距离usemap来实现按钮跳转.------第8尾集 3.表单必须要有name和value,因为抓包的时候,可发现必须 ...
- dedecms织梦二级菜单的实现方法
首先,复制代码: 程序代码 {dede:channelartlist typeid='top' cacheid='channelsonlist'} {dede:channel type='son' n ...
- CSS3 box-shadow(阴影使用)
from: http://jingyan.baidu.com/article/03b2f78c4d9fae5ea237aea6.html css3 box-shadow 内阴影与外阴影 1- box- ...
- Python自动化运维之23、Dom
文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.最为关心的是,DOM把网页 ...