【问题标题】:Issue in Transaction Scope inside WCFWCF 内部事务范围的问题
【发布时间】:2011-06-17 13:37:07
【问题描述】:

在我的项目中,DAL 是 WCF 服务 .Net4.0。使用数据库 oracle 11g。我在 WCF(服务器端)中使用事务范围。 如果任何一个 sp 失败,我必须在方法(操作合约)中调用多个存储过程,我需要回滚已经执行的 sp。但回滚没有发生。我没有使用客户端事务流程。

我已经放了示例代码

公共类服务:IService {

public bool Method1()
    {
        using (TransactionScope Scope1 = new TransactionScope())
        {
            Method2();
            Method3();
            Scope1.Complete();
        }
        return true;
    }

    public bool Method2()
    {
        using (TransactionScope Scope2 = new TransactionScope())
        {
            // Procedure call .....
            Scope2.Complete();
        }
        return true;
    }

    public bool Method3()
    {
        using (TransactionScope Scope3 = new TransactionScope())
        {
            // Procedure call .....
            Scope3.Complete();
        }
        return true;
    }

}

【问题讨论】:

  • 你能把你的代码贴出来

标签: wcf transactions transactionscope


【解决方案1】:

我看不出有什么理由不能按预期工作,就像您在那里放置代码的方式一样。

但是,如果您使用的是 WCF,则可能需要考虑使用 WCF 中内置的事务流。您可以通过这种方式将整个 WCF 调用包装到单个事务中,而无需手动创建和管理 TransactionScope。 WCF 事务流可以设置为需要服务端的事务,因此如果客户端没有通过,WCF 将为您启动一个事务。这样,您根本不必编辑您的客户端。 http://msdn.microsoft.com/en-us/library/ms751413.aspx

【讨论】:

  • 我的理解是 WCF 不是一个因素,因为事务在服务端,客户端和服务器之间没有事务流动。您是否考虑过分析 SQL 以查看何时在服务器上执行开始/结束事务调用?
  • @Rich - 我同意 WCF 在这里并不是一个真正的因素,但是他说他正在使用它,所以我建议改用事务流,因为这样你就可以依靠 WCF 来制作 1事务范围独立,而不是手动设置每一个,担心嵌套它们,然后调用 Complete。手动设置方法肯定更容易出错。跟踪开始/结束事务也绝对是个好主意。
猜你喜欢
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 2020-04-26
  • 2011-05-28
  • 1970-01-01
  • 2012-06-20
  • 2016-06-23
相关资源
最近更新 更多