2012-12-13 54 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