2

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

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

4

1 回答 1

1

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

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

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

于 2012-12-13T20:05:47.510 回答