【问题标题】:HRESULT: 0x8004D00E using TransactionScope - C#HRESULT:0x8004D00E 使用 TransactionScope - C#
【发布时间】:2009-04-23 23:59:47
【问题描述】:

当我尝试在连接到 SQL Server 2000 的 Windows Server 2003 Standard Edition SP1 计算机上运行 C# WinForms 应用程序时收到以下错误,在 WinForms 应用程序中转换数据并将转换后的数据插入 SQL 服务器2005 年申请。我正在使用 SSPI 连接到每个数据库。

代码包含在 TransactionScope 块中:

System.TimeSpan TransactionTimeOut = new TimeSpan(0, 40, 0);

    using(TransactionScope Scope = new TransactionScope(TransactionScopeOption.RequiresNew, TransactionTimeOut))
    {
        try
        {
            //meat of transaction...
        }
        catch(Exception ex)
        {
            throw ex;
        }

        Scope.Complete();
    }

错误信息:

异常:交易已经 被隐含或明确地 已提交或中止。

内部异常:交易有 已经隐式或显式地 已提交或中止(异常来自 HRESULT: 0x8004D00E)

有人知道是什么原因造成的吗?

【问题讨论】:

  • 它在哪一行引发异常?而且,你为什么要在 using 块中捕获异常?
  • 我在远程服务器上运行应用程序,所以我无法捕获行号。我将 try/catch 块放在 using 语句中,因为它是我建立连接和处理数据的唯一地方。

标签: c# .net sql-server-2005 sql-server-2000 transactionscope


【解决方案1】:

检查 DTC 是否在运行您的代码的机器上启动。由于您在事务范围内使用了 2 个连接,因此事务将被提升为基于 DTC 的事务。

此外,请检查安全配置是否正确(通过允许匿名参与 DTC 交易来检查),以及您的防火墙是否允许 DTC 通过它。

查看此论坛常见问题解答:Distributed Transaction Coordinator(MSDTC) and Transaction FAQ

[与此 SO 问题相关:Distributed Transaction Coordinator]

【讨论】:

  • DTC 在服务器上设置为相互验证,不幸的是我必须填写更改请求来调整服务器上的任何设置,因为它是在生产环境中
  • 我必须将 MSDTC 事务管理器通信设置从“需要相互验证”设置为“不需要验证”...感谢您提供的信息。
  • 你是在哪里/如何做出改变的?
  • 控制面板->管理工具->组件服务。展开组件服务-> 计算机-> 右键单击​​我的电脑并选择属性。选择 MSDTC 选项卡,单击安全配置,它位于事务管理器通信部分下。
【解决方案2】:

这个过程需要多长时间?如果您达到了超时(不太可能有 40 分钟的超时,但仍有可能),您可能会收到该错误消息。

否则,您是否收到异常?在抛出异常之前发生了什么?

【讨论】:

  • 我只处理了大约 6500 条记录,所以我绝对没有达到我的超时阈值。这是我尝试运行该进程时遇到的唯一异常
  • 为了尝试他的解决方案,我需要获得在服务器上进行更改的权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多