您的位置:首页 > 其它

快速入门系列--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对象来控制事务,但这些只能支持单个链接的本地事务,而不能支持分布式事务。但实际的项目中,事务的参与者往往不会分布在同一个网络节点,有时是不同类型的事务资源(不仅仅是数据库,也可以是文件系统,注册表等)。分布式事务的典型业务场景有以下三类:将多个资源的访问纳入同一事务;将多个服务纳入同一事务(涉及事务在服务间的流转);将多个资源和服务纳入同一事务(如下图所示)。

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: