快速入门系列--WCF--05事务
2015-10-30 18:29
363 查看
最近开始WCF相关知识的学习,虽然实际工作中使用公司自己的一套SOA系统,但微软的一套服务架构还是具有很大的参考意义。除了WCF的一些基础使用,相对比较复杂的内容有分布式的事务和通信的安全等,不过基本都和WS-协议簇相关联。为了引出WCF中的事务处理,今天优先介绍Windows下的事务处理模型,说实话用了很多年的TransactionScope,其实我一直都不知道它到底是如何运作的,回想Java中不管是EJB还是Spring也有和这部分类似的实现。今天通过学习蒋金楠老师的WCF服务框架解析来了解这部分的原理。
首先回忆事务的概念和相关应用机制。事务具有ACID(原子性,一致性,隔离性,持久性)特性,主要的应用场景比如银行转账,大部分的数据库都支持事务操作(SQL Server,Oracle,DB2,MySQL-InnoDB)。事务的实现最常见的有在SQL语句中使用事务BEGIN TRANSACTION, COMMIT TRANSACTION, ROLLBACK TRANSACTION,还可以通过ADO.NET的DbTransaction对象来控制事务,但这些只能支持单个链接的本地事务,而不能支持分布式事务。但实际的项目中,事务的参与者往往不会分布在同一个网络节点,有时是不同类型的事务资源(不仅仅是数据库,也可以是文件系统,注册表等)。分布式事务的典型业务场景有以下三类:将多个资源的访问纳入同一事务;将多个服务纳入同一事务(涉及事务在服务间的流转);将多个资源和服务纳入同一事务(如下图所示)。
View Code
最后介绍实际工作中最常见的TransactionScope类,如之前提到的事务型方法就有如下简易实现。
需要注意的是TransactionScopeOption的设置,有如下三种类型:Required,表示如果存在环境事务则使用,否则进入范围前创建新的事务;RequiresNew,表示总是在该范围创建新事物;Suppress,表示屏蔽环境事务,即所有操作均在无环境事务的情况下执行。这个J2EE Spring中的REQUIRED 、REQUIRES_NEW 、 NOT_SUPPORTED很相似,不过对于J2EE与DTC相类似的机制个人还未涉猎,之后有机会再和大家分享了。
注:本文主要供自己学习,不妥之处望见谅。
参考资料:
[1]蒋金楠. WCF全面解析[M]. 上海:电子工业出版社, 2012.
首先回忆事务的概念和相关应用机制。事务具有ACID(原子性,一致性,隔离性,持久性)特性,主要的应用场景比如银行转账,大部分的数据库都支持事务操作(SQL Server,Oracle,DB2,MySQL-InnoDB)。事务的实现最常见的有在SQL语句中使用事务BEGIN TRANSACTION, COMMIT TRANSACTION, ROLLBACK TRANSACTION,还可以通过ADO.NET的DbTransaction对象来控制事务,但这些只能支持单个链接的本地事务,而不能支持分布式事务。但实际的项目中,事务的参与者往往不会分布在同一个网络节点,有时是不同类型的事务资源(不仅仅是数据库,也可以是文件系统,注册表等)。分布式事务的典型业务场景有以下三类:将多个资源的访问纳入同一事务;将多个服务纳入同一事务(涉及事务在服务间的流转);将多个资源和服务纳入同一事务(如下图所示)。
private static void Transfer(string accountFrom, string accountTo, double amount) { Transaction originalTransaction = Transaction.Current; CommittableTransaction ct = new CommittableTransaction(); try { Transaction.Current = ct; ThreadPool.QueueUserWorkItem(state => { Transaction.Current = state as DependentTransaction; try { Withdraw(accountFrom, amount); Deposit(accountTo, amount); (state as DependentTransaction).Complete(); } catch (Exception ex) { Transaction.Current.Rollback(ex); } finally { (state as DependentTransaction).Dispose(); Transaction.Current = null; } }, Transaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete)); ct.Commit(); } catch { ct.Rollback(); throw; } finally { Transaction.Current = originalTransaction; ct.Dispose(); } }
View Code
最后介绍实际工作中最常见的TransactionScope类,如之前提到的事务型方法就有如下简易实现。
static void InvokeInTransaction(Action action) { using (TransactionScope ts = new TransactionScope()) { action(); ts.Complete(); } }
需要注意的是TransactionScopeOption的设置,有如下三种类型:Required,表示如果存在环境事务则使用,否则进入范围前创建新的事务;RequiresNew,表示总是在该范围创建新事物;Suppress,表示屏蔽环境事务,即所有操作均在无环境事务的情况下执行。这个J2EE Spring中的REQUIRED 、REQUIRES_NEW 、 NOT_SUPPORTED很相似,不过对于J2EE与DTC相类似的机制个人还未涉猎,之后有机会再和大家分享了。
注:本文主要供自己学习,不妥之处望见谅。
参考资料:
[1]蒋金楠. WCF全面解析[M]. 上海:电子工业出版社, 2012.
相关文章推荐
- bash字符串操作
- 2、八皇后问题——回溯法
- UVA 679
- linux程序包管理之yum
- linux DTS 分析
- Matrix中preXxx,setXxx,postXxx方法的使用
- 自定义dialog的布局样式
- 完美解决HorizontalScrollView与ListView滑动事件冲突
- 正则表达式基础常识
- 中文分词-常宝宝课件
- bash数组操作-定义/初始化/赋值…
- SpringMVC(二) 流程控制
- Cg shader with reflection map
- Java泛型(一)
- 学习算法之路
- 在java中用递归函数求出1!+2!+3!+4!。。。。。。。
- POJ-2234:Matches Game
- 给hmailserver添加SSL支持
- http://www.cnblogs.com/TankXiao/archive/2012/02/06/2337728.html
- 期权交易与期货交易