zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    完整安装IIS服务
    IIS支持json、geojson文件
    C# ODP.Net oracle数据库操作 支持不安装客户端
    RabbitMQ —— spring标签整合实现(API介绍)
    RabbitMQ —— spring标签整合实现
    RabbitMQ —— spring整合发送异步消息
    RabbitMQ —— spring整合发送同步消息
    RabbitMQ Spring 相关类信息
    RabbitMQ 消息流转示意图
    RabbitDemo —— 延迟队列(在消息上设置TTL)
  • 原文地址:https://www.cnblogs.com/mane/p/1831349.html
Copyright © 2011-2022 走看看