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

     

  • 相关阅读:
    SuperMap房产测绘成果管理平台
    SuperMap产权登记管理平台
    Android adb shell am 的用法(1)
    由浅入深谈Perl中的排序
    Android 内存监测和分析工具
    Android 网络通信
    adb server is out of date. killing...
    引导页使用ViewPager遇到OutofMemoryError的解决方案
    adb logcat 详解
    How to send mail by java mail in Android uiautomator testing?
  • 原文地址:https://www.cnblogs.com/mane/p/1831349.html
Copyright © 2011-2022 走看看