none
请问WCF事务的一些内容 RRS feed

  • 问题

  •  1   一个项目中有几个WCF服务, 一个方法里同时渗杂着几个WCF服务的方法.

    我想实现这样的效果: 在方法A里面有B服务的方法, 也有C服务的方法.


    举个例子

    B服务的方法:  public void B ()  {  操作数据库  }   

    C服务的方法:public void C() { 操作数据库 }

    A方法调用B服务和C服务

    public void A()
    {
     using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())
    {

    try
    {
       //  调用B服务的方法
       //  调用C服务的方法
    }
     // 回滚
      catch(Exception ex)
                    {
               System.Transactions.Transaction.Current.Rollback();
                    }
    // 成功时提交
     ts.Complete();
    }
    }

    B服务和C服务全部采用WsHttpBinding ,
    我在B服务和C服务上尝试了  TransactionFlowOption.Allowed  , TransactionScopeRequired = true 
                                           TransactionFlowOption.Mandatory, TransactionScopeRequired = true

    但都没有做到事务的回滚,  除非在B服务和C服务上面加上 using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())

    才可以。   请问一下,我可不可以不加上面这行呢。 

    2  WCF有没有像WEB服务那样可以设置服务的Url ?



    学习者
    2009年12月14日 7:35

答案

  • 这个配置已经讲 了啊,按照步骤来就可以啊;
    【5.1】. Client/Service transaction,最常见的一种事务模型,通常由客户端或服务本身启用一个事务。设置步骤:
    (1) 选择一个支持事务的Binding,设置 TransactionFlow = true。
    (2) 设置 TransactionFlow(TransactionFlowOption.Allowed)。
    (3) 设置 OperationBehavior(TransactionScopeRequired=true)。
    【5.2】. Client transaction,强制服务必须参与事务,而且必须是客户端启用事务。设置步骤:
    (1) 选择一个支持事务的Binding,设置 TransactionFlow = true。
    (2) 设置 TransactionFlow(TransactionFlowOption.Mandatory)。
    (3) 设置 OperationBehavior(TransactionScopeRequired=true)。
    【5.3】. Service transaction,服务必须启用一个根事务,且不参与任何外部事务。设置步骤:
    (1) 选择任何一种Binding,设置 TransactionFlow = false(默认)。
    (2) 设置 TransactionFlow(TransactionFlowOption.NotAllowed)。
    (3) 设置 OperationBehavior(TransactionScopeRequired=true)。

    ,事物在分布式环境下测试需要启动DTC服务。
    你可以看看WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程
    下面的讨论留言
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    • 已标记为答案 Mog Liang 2009年12月21日 9:39
    2009年12月15日 10:03
    版主
  • System.Transactions.TransactionScope
    使用这个.NET 2.0 的新事务,需要启动DTC服务
    Distributed Transaction Coordinator

    协调跨多个数据库、消息队列、文件系统等资源管理器的事务。如果停止此服务,则不会发生这些事务。如果禁用此服务,显式依赖此服务的其他服务将无法启动。
    2010年1月26日 5:46

全部回复

  • Hi.
    1.WCF 事务有3种启动事务的模式。分别是:Client/Service transaction、Client transaction、Service transaction模式。他们分别的设置情况是:

    【5.1】. Client/Service transaction,最常见的一种事务模型,通常由客户端或服务本身启用一个事务。设置步骤:
    (1) 选择一个支持事务的Binding,设置 TransactionFlow = true。
    (2) 设置 TransactionFlow(TransactionFlowOption.Allowed)。
    (3) 设置 OperationBehavior(TransactionScopeRequired=true)。
    【5.2】. Client transaction,强制服务必须参与事务,而且必须是客户端启用事务。设置步骤:
    (1) 选择一个支持事务的Binding,设置 TransactionFlow = true。
    (2) 设置 TransactionFlow(TransactionFlowOption.Mandatory)。
    (3) 设置 OperationBehavior(TransactionScopeRequired=true)。
    【5.3】. Service transaction,服务必须启用一个根事务,且不参与任何外部事务。设置步骤:
    (1) 选择任何一种Binding,设置 TransactionFlow = false(默认)。
    (2) 设置 TransactionFlow(TransactionFlowOption.NotAllowed)。
    (3) 设置 OperationBehavior(TransactionScopeRequired=true)。
    当然看你事务的级别,事务资源管理器会做适当的提升。如果你对单独的操作启用事务,它只能保证事务在此操作范围内有效。你的case应该需要启用一个根事务。
    可以参考;WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程
    2.可以设置,你可以参考一些Rest WCF 的文章。
    http://msdn.microsoft.com/zh-cn/netframework/dd547388.aspx


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年12月14日 10:58
    版主
  •   能具体的讲讲该怎么设置吗?    我试过那三种, 好像没有用...  

      

    学习者
    2009年12月14日 11:15
  • 这个配置已经讲 了啊,按照步骤来就可以啊;
    【5.1】. Client/Service transaction,最常见的一种事务模型,通常由客户端或服务本身启用一个事务。设置步骤:
    (1) 选择一个支持事务的Binding,设置 TransactionFlow = true。
    (2) 设置 TransactionFlow(TransactionFlowOption.Allowed)。
    (3) 设置 OperationBehavior(TransactionScopeRequired=true)。
    【5.2】. Client transaction,强制服务必须参与事务,而且必须是客户端启用事务。设置步骤:
    (1) 选择一个支持事务的Binding,设置 TransactionFlow = true。
    (2) 设置 TransactionFlow(TransactionFlowOption.Mandatory)。
    (3) 设置 OperationBehavior(TransactionScopeRequired=true)。
    【5.3】. Service transaction,服务必须启用一个根事务,且不参与任何外部事务。设置步骤:
    (1) 选择任何一种Binding,设置 TransactionFlow = false(默认)。
    (2) 设置 TransactionFlow(TransactionFlowOption.NotAllowed)。
    (3) 设置 OperationBehavior(TransactionScopeRequired=true)。

    ,事物在分布式环境下测试需要启动DTC服务。
    你可以看看WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程
    下面的讨论留言
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    • 已标记为答案 Mog Liang 2009年12月21日 9:39
    2009年12月15日 10:03
    版主
  • System.Transactions.TransactionScope
    使用这个.NET 2.0 的新事务,需要启动DTC服务
    Distributed Transaction Coordinator

    协调跨多个数据库、消息队列、文件系统等资源管理器的事务。如果停止此服务,则不会发生这些事务。如果禁用此服务,显式依赖此服务的其他服务将无法启动。
    2010年1月26日 5:46