2013-05-29 42 views
1

我有一些代碼查詢後端SQL服務器:設置連接超時是否會終止服務器端的查詢?

using (SqlConnection con = new SqlConnection(connString)) 
{ 
    SqlDataReader dr; 
    SqlCommand cmd; 
    cmd = new SqlCommand("PROC1", con); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandTimeout = 300; 

    try 
    { 
     con.Open(); 
     dr = cmd.ExecuteReader(); 

     while(dr.Read()) 
     { 
      // ... 
     } 
    } 
    catch (SqlException e) 
    { 
     // Some logging 
    } 
    catch (Exception e) 
    { 
     // Some logging 
    } 
} 

一旦發生超時,我期待的連接將被關閉和優秀的查詢將被殺死。我面臨的問題是tempdb尺寸不變或不斷增加。因爲有許多其他進程訪問同一臺服務器,所以我想確保我不會因此而導致這種情況。

當發生查詢超時時,我是否可以期待SQL Server清理並正確殺死服務器端的未完成查詢,還是應該從我身邊做更多事情?

+0

首先,tempdb大小將保持不變,除非您打開自動縮小,這通常不是一種好的做法。我會花更多的時間來尋找調查哪些進程影響tempdb的時間。存儲過程的實際內容是什麼?你確定它使用tempdb?其次,超時不會立即終止交易。它必須達到可以回滾的點。進程可能超出超時甚至掛起。這與在Management Studio中停止查詢確實沒有什麼不同,它需要一段時間才能實際停止。 –

+0

標題問題的答案是「不」。在你的應用程序中可能有些東西可以做,但我不確定那會是什麼。 –

+0

@ChrisH:我正在使用臨時表來存儲發起到遠程鏈接服務器的查詢的結果。有時服務器需要很長時間,因此我設置了超時時間。在並行執行環境中(我有20-30個線程調用查詢),這個場景如何處理? – Legend

回答

1

當您在服務器上運行任何代碼時,客戶端保持連接並正在等待來自服務器的響應。

超時 - 客戶端在關閉客戶端連接之前等待服務器響應的最長時間。所以服務器上的代碼會一直運行直到它完成或失敗(例如tempDB溢出錯誤)。

所以你不能指望事務在默認情況下超時終止。

+0

+1謝謝。如果它是一個'SELECT'查詢而不是一個獨佔事務。我已經看到服務器(至少在我使用SQL Server Management Studio時)在終止之前(在單擊停止按鈕之後)繼續執行查詢一段時間。你知道爲什麼發生這種情況嗎? – Legend

+0

任何語句都在事務中運行。如果您沒有明確指定事務,那麼它是隱式事務。在您點擊停止按鈕SSMS發送命令以終止事務。當服務器有可用資源時,它會處理該命令:它停止執行並清理用於計算和結果集的日誌和tempDB空間。 – Stoleg

相關問題