我遇到了一个非常奇怪的问题:即使正确及时地插入数据,存储过程也不会返回。关于这一点最令人震惊的事情是记录时间戳字段总是在毫秒内填充,因此数据似乎非常快速地进入表中。但回归永远不会发生。
所有这一切的重要部分是它只在负载下发生 - 个别请求就好了。只有当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策略的情况下执行非常昂贵的查询,这会破坏脆弱的硬件负载平衡。谢谢你的所有提示。
答案 0 :(得分:1)
根据提供的信息,我最好的猜测是存储过程中存在意外问题。
尝试在存储过程中使用事务。如果我的理论是正确的,那么就不会插入任何记录。
检查MyTable2上是否有任何锁定。如果您在其他地方对该表进行大选,请确保使用nolock。