2012-12-13 29 views
2

我遇到了一个非常奇怪的问题:存储过程不会返回,即使数据正确和及时插入。最令人惊讶的是,记录时间戳字段总是在毫秒内填充,因此数据似乎非常快速地进入表格。但返回从未发生。存储过程不返回控制到C#代码

所有这一切的重要部分是,它只发生在负载下 - 个人请求很好。只有当数据库足够强调时,这件事才会开始发生。

任何想法都是受欢迎的,因为我很少理解什么是错的。

这里被简化它的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 

UPDATE:我们做了最好的超时和SQL服务器的活动相关,它出现非应用用户活动导致锁定。该过程旨在允许非常快速的插入和非常快速的读取。但是,有些个人会执行相当昂贵的查询,而实际上并未使用DIRTY READ策略,该策略正在打破脆弱的硬件负载平衡。感谢您的所有提示。

+0

RETURN在哪里? –

+0

没有任何价值的回报。通过返回,我的意思是SP永远不会返回,异常会在C#端被捕获。 – Schultz9999

+0

你的意思是ExecuteNonQuery()挂起? –

回答

1

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

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

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

+0

我不明白你的推理。如果插入数据,那么防止SP返回的是什么?因为SP是文学的一个INSERT语句。关于第二个INSERT是一个调试,只是为了确保第一个完全执行。实际上,我们添加了两个插入,并且它们都成功创建了具有良好日期时间值的记录。 – Schultz9999

+0

没有下一行。主INSERT后跟一个受控的一个到不同的表中。 – Schultz9999

+0

奇怪!好的,那么抛出的异常是什么,它是抓住你的内部捕获还是外部捕获? – humblelistener