WCF事务的概念与入门详解(二)

我们不仅可以使用声明的方式创建事务,也可以使用显式方法创建事务,如下:

显式事务

WCF使用显式事务编程的方法是构造一个TransactionScope类,我们可以将它放在using()中自动销毁对象,具体方法如下:

using(TransactionScope scope=new TransactionScope())

{

scope.Complete();//将一致性校验设为true

}

 

事务投票

在显式事务中对象无法获知事务是否应该提交或终止,所以,我们可以将一致性校验设为true,如:scope.Complete();Complete()必须是最后一个方法,且只能调用一次,再次调用将会引起异常,调用Complete()方法后,当错误发生是将自动投票终止事务.

 

嵌套事务

由using()定义的事务范围可以嵌套,如果事务范围创建了一个它要使用的新事务,则这个事务就是跟事务范围,WCF提供了TransactionScopeOption枚举在TransactionScope类的构造函数的重载函数中,这几个枚举分别为:

TransactionScopeOption.Required,如果存在一个环境事务,则以此为跟事务范围将当前事务范围加入该事务

TransactionScopeOption.RequiredNew,顾名思义这是启动一个新事务

TransactionScopeOption.Suppress,它将不会成为事务的一部分

在嵌套的事务范围中调用Complete对他的父事务是没有影响的,但只要当该事务提交后,父事务才能提交

 

事务的属性

显式事务同样可以设置隔离性和超时的数值,可以在TransactionScope的构造函数中接收一个TransactionOptions类型的结构,在该结构中定义了IsolationLevel枚举,该枚举可以设置隔离等级,正如上一篇博客上讲的TransactionIsolationLevel一样,TransactionIsolationLevel属性也是IsolationLevel枚举类型,

TransactionOptions option=new TransactionOptions();

option.IsolationLevel=IsolationLevel.Chaos;//设置隔离等级

option.Timeout=TransactionManager.DefaultTimeout;//设置超时

using(TransactionScope scope=new TransactionScope(TransactionScopeOption.Required,option))

{

}

 

上面分别针对WCF事务进行了详细的解释,但我们知道,在WCF中我们可以使用单调服务,会话服务和单例服务,那么在不同的操作中,WCF如何获取和保存自己的状态(状态包括事务的资源和客户端及服务在内存中的实例)?WCF推荐我们使用单调服务,因为单调服务每次调用时都会取出并保存自己的状态,

1.单调服务

单调服务需要设置自动投票TransactionAutoComplete=true

2.会话服务

会话服务可以利用ServiceBehavior的ReleaseServiceOnTransactionComplete 属性设置为true(默认)设置为类似单调服务的自动管理状态(注意:不同的TransactionAutoComplete设置完成释放实例的方式也不同)。当ReleaseServiceOnTransactionComplete 属性设置为true需要满足:1.至少包含一个操作TransactionScopeRequired=true  2.并发模式下必须设置为ConcurrencyMode.Single

我们也可以将它设置为false自己管理状态,如使用会话ID作为状态标识符等。我们也可以使用另外一种编程模型将ServiceBehavior 的属性AutoCompleteOnSessionClose设置为true自动完成会话中所有未完成的方法,在客户端要求在事务完成前就终止会话,如:

using (TransactionScope scope=new TransactionScope())

{

   MyContractclient proxy=new  MyContractclient();

   proxy.Mythod();

   proxy.Close();

   scope.Complete();

}



3.单例服务

因为ReleaseServiceOnTransactionComplete默认为true所以单例服务表现和单调服务类似,单例服务需要积极管理状态。使用独有的GUID作为状态标识符,并在启动宿主前创建,关闭时删除,WCF还要保证在任何时间只有一个单独的实例在运行,因此必须阻止并发模式,即设置ConcurrencyMode.Single

 

posted @ 2010-09-19 23:37  Yao,Mane  阅读(1972)  评论(2编辑  收藏  举报