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 ...
随机推荐
- 彻底删除mysql的方法(有隐藏文件)
1.建议使用360进行卸载,可以彻底卸载软件 2.360会提醒删除注册表 3.这个隐藏文件要删除掉 在 C:\Documents and Settings\ 路径下搜索 MySQL 文件夹(默认隐藏的 ...
- Uri、UriMatcher、ContentUris详解
http://blog.csdn.net/feng88724/article/details/6331396 1.Uri 通用资源标志符(Universal Resource Identifier, ...
- SGU 133.Border
水题不说了 #include <iostream> #include <cstring> #include <cstdio> #include <cmath& ...
- 自构BeanHandler(用BeansUtils)
class BeanHandler<T> implements ResultSetHandler<T>{ private Class<T> clazz; publi ...
- 关于Linux 交互(用户操作接口)
Linux 系统提供两种基本接口给用户操作:命令行,图形界面. 不同接口也有相应的访问终端. 一.命令行 Command Line Linux系统命令行,一般指 Shell. Shell 接受经键盘输 ...
- sql server 数据分页显示。
select [ID] ,[StockApplyCode] ,[RcCode] ,[LabCenterCode] ,[LabGroupCode] ,[LabGroupName] ,[Barcode] ...
- js基础 - 兼容代码
js基础 - 兼容代码 . scrollTop . chrome document.body.scrollTop . IE && firefox document.documentEl ...
- Android SlidingMenu开源库及其使用
极客学院教程: http://www.jikexueyuan.com/course/61_5.html?ss=1 1. SlidingMenu开源库的配置 2. SlidingMenu 的使用 --- ...
- 测试通过Word直接发布博文
这里是来自word 2013的一篇测试文章. 测试直接通过Word自带的bloger功能发布博客文章. 这里插入一张图片
- C语言-01基础语法
1) 总结常见文件的拓展名 .c 是C语言源文件,在编写代码的时候创建 .o 是目标文件,在编译成功的时候产生 .out 是可执行文件,在链接成功的时候产生 2) 总结 ...