簡體   English   中英

如果查詢超時,會發生什么情況?

[英]What Happens To a Query If It Times Out?

假設我有一個查詢發送到我的 SQL-Server 數據庫,它需要 30 多秒,並且我的程序拋出 SQL 查詢超時異常。 查詢是否仍在我的數據庫中運行,還是在拋出異常后立即終止?

客戶端使用注意事件向服務器發送查詢超時信號。 注意事件只是 SQL 服務器客戶端可以發送給它的不同類型的 TDS 數據包。 除了連接/斷開連接、T-SQL 批處理和 RPC 事件之外,客戶端還可以向服務器發出注意信號。 注意告訴服務器盡快取消連接當前正在執行的查詢(如果有的話)。 注意不會回滾打開的事務,也不會立即停止當前正在執行的查詢——服務器會在下一個可用機會時中止它為連接所做的一切。 通常,這會很快發生,但並非總是如此。

來源沒有查詢超時之類的東西......

當客戶端決定該命令運行的時間足夠長時,它會發出“Abort”。 查詢只是停止在數據庫中運行。

任何 CATCH 塊都不會被命中,事務將保持打開狀態,並且在此之后仍然可以分配鎖,即使連接已關閉,因為“關閉”意味着“返回連接池”。

如果您預計會有很多命令超時,那么請考慮使用SET XACT_ABORT ON以及 this )這釋放鎖定和回滾事務。 或修復代碼...

在執行查詢之前,SQL 服務器估計它需要運行多少 memory 並嘗試從緩沖池中保留此數量的 memory。 如果預訂成功,則立即執行查詢。 如果沒有足夠的 memory 從緩沖池中隨時可用,則將查詢放入具有超時值的隊列中,其中超時值由查詢成本指導。 基本規則是:估計成本越高,超時值越大。 當此查詢的等待時間超過超時值時,將拋出超時錯誤並將查詢從隊列中刪除。

資源

If you get a SQL timeout then SQL has stopped, however web applications can time out and the SQL query can continue.

通常,超時意味着連接已斷開,這意味着查詢尚未發送到數據庫,大多數數據庫都支持事務,您可以在其中啟動事務,運行查詢,如果您滿意,您可以提交它們。

例子:

BEGIN TRAN

UPDATE  authors
   SET  au_fname = 'John'
WHERE   au_id = '172-32-1176'

UPDATE  authors
   SET  au_fname = 'Marg'
WHERE   au_id = '213-46-8915'

COMMIT TRAN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM