存储过程不会将控制权返回给C#代码

时间:2012-12-13 19:55:15

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

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

所有这一切的重要部分是它只在负载下发生 - 个别请求就好了。只有当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策略的情况下执行非常昂贵的查询,这会破坏脆弱的硬件负载平衡。谢谢你的所有提示。

1 个答案:

答案 0 :(得分:1)

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

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

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