【问题标题】:stored procedure doesn't return control to C# code存储过程不会将控制权返回给 C# 代码
【发布时间】:2012-12-13 19:55:15
【问题描述】:

我遇到了一个很奇怪的问题:即使正确及时地插入了数据,存储过程也没有返回。最令人震惊的是,记录时间戳字段总是在几毫秒内填充,因此数据似乎非常快地进入表。但返回永远不会发生。

所有这一切的重要部分是它只发生在负载下——单个请求就可以了。只有当 DB 压力足够大时,这件事才会开始发生。

欢迎提出任何想法,因为我不太了解可能出现的问题。

这里是简化的 C# 部分:

try 
{
    using (var conn = new SqlConnection(connString))
    {
        conn.Open();

        using (var cmd = new SqlCommand(conn, ....)
        {
            cmd.CommandType = StoredProcedure;

            cmd.ExecuteNonQuery();

            // THIS NEVER EXECUTES:
            ReportSuccess();
        }
    }
}
catch (TimeoutException)
{
    // EXCEPTION HERE
}

还有存储过程:

CREATE PROCEDURE dbo.Blah
BEGIN
    INSERT dbo.MyTable VALUES (...)

    INSERT dbo.MyTable2...

    -- Here is where everything stops.

END

更新:我们尽最大努力将超时和 SQL 服务器活动关联起来,并且似乎非应用用户活动导致了锁定。该过程旨在允许非常快速的插入和非常快速的读取。然而,有些人会在不实际使用 DIRTY READ 策略的情况下执行非常昂贵的查询,这会破坏脆弱的硬件负载平衡。不过感谢您的所有提示。

【问题讨论】:

  • 没有返回任何值。通过返回,我的意思是 SP 永远不会返回,并且在 C# 端捕获了异常。
  • 你的意思是 ExecuteNonQuery() 挂起?
  • @Maciej TimeoutException
  • 你试过在 ssms 中调试你的存储过程吗?
  • 可能是表被另一个进程/事务锁定了?

标签: c# .net sql sql-server stored-procedures


【解决方案1】:

根据提供的信息,我最好的猜测是您的存储过程中存在意外问题。

尝试在存储过程中使用事务。如果我的理论是正确的,则不会插入任何记录。

检查 MyTable2 上是否有任何锁被获取。如果您在其他地方对该表进行大选择,请确保您使用的是 nolock。

【讨论】:

  • 我不明白你的推理。如果插入了数据,那么是什么阻止了 SP 返回?因为SP是文学的一种INSERT语句。第二个 INSERT 是一个调试,只是为了确保第一个被完全执行。事实上,我们又添加了两个插入,它们都成功地创建了具有良好日期时间值的记录。
  • 没有下一行。主 INSERT 后跟一个受控插入到不同的表中。
  • 奇怪!!好的,那么抛出的异常是什么,是你的内部catch还是外部catch?
  • 没有内部问题——我提出问题时的错。删除并澄清。
  • 发生超时可能有两个原因 1. 如果查询从未返回 2. 如果连接关闭超时(通过使用范围隐式处理)。您可以通过像以前一样的内部异常来确认这一点,并查看异常被捕获的位置
猜你喜欢
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多