分布式,面向服务的系统依赖于:
访问远程应用程序的功能
功能执行的可预测性
系统可用性与一致性
网络连接
WCF提供了可靠性特性
可靠性回话
事务支持
可持久划的消息队列
WCF事务
在绑定上开启事务流
必须选择事务协议
指定支持事务的服务操作
服务操作必须显示地指明加入现有的事务或者创建新的事务
绑定支持
许多绑定都支持跨服务边界的事务流
NetNamedPipeBinding
NetTcpBinding
WSHttpBinding
WSDualHttpBinding
WSFederationHttpBinding
每个绑定缺省与特性的传输协议相关
打开事务流
事务流缺省是关闭的
在配置文件中为绑定打开支持事务的特性
使得客户端可以将事务流动到服务端
<WSHttpBinding> <binding name="WSHttp" transationFlow="true"/> </WSHttpBinding>
事务流动选项
在服务契约中,为服务操作应用,TransanctionFlowAttribute
设置TransanctionFlowOptionto
NotAllowed,此操作不使用事务,不会加入到客户端的上下文环境之中
Mandatory,操作加入到客户端的事务上下文环境之中
Allowed,客户端有事务的上下文环境则加入,没有则自己创建一个新事务
控制服务端是否允许或者要求使用客户端的事务
[operationContract] [TransactionFlow(TransactionFlowOption.Allowed)] void ResetCounters();
服务操作
OprationBehaviorAttribute
TransactionScopeRequired属性
当需要加入到客户端事务或者操作在被调用是需要创建新的事务的时候,将其设置为true
设置为false(缺省)不做任何事情
TransactionAutoComplete属性
设置为true时,自动投提交票
当抛出异常时,投终止票
[OperationBehavior(TransactionScopeRequired=true,TransactionAutoComplete=true)] public void ResetCounters()
客户端配置
对于客户端的事务流传播:
在绑定上打开事务流
具有要传播的事务
在代理的服务契约上,事务流选项被设置为Mandatory或者Allowed
事务协议选项
WCF支持多种事务协议
OleTransaction:跨进程与网络边界
WSAtomocTransanction11:在HTTP上跨服务边界
传输协议选项
NetTcpBinding and NetNamedPipeBinding支持可配置的事务协议
<netTcpBinding> <binding name="netTcp" transactionFlow="true" transactionProtocol="WSActionTransaction11" </netTcpBinding>
当服务上下文环境为percall是按照上面的设置,当服务上下文环境为persession时
[Servicebehavior(InstanceContextMode=InstanceContextMode.Persession,TransactionAutocomplateOnSessionClose=true)]
每一个操作上的TransactionAutoComplete=false
事务超时
事务的缺省超时为60秒
可以在配置文件中控制
<behaviors> <serviceBehaviors> <servicemetadata httpGetEnable=“true"/> <serviceTimeouts transactionTimeout="00:00:01" </servicebehaviors> </behaviors>
也可以在代码中控制,加在servicebehavior上 TransactionTimeout="00:00:01"
控制隔离级别
IsolationLevel枚举
Chaos,ReadCommitted,ReadUncommitte,RepeatableRead,Serializable,Snapshot,Unspecified
缺省情况下,服务计入到客户端的隔离级别中
需要权衡并发性的效率和隔离级别