常見的SQL Server阻塞情形有哪些?
以下的文章主要描述的是常見的SQL Server阻塞情形,在實際操作中SQL Server阻塞是經常出現的,那么它們會以什么形式出現的呢?以下的文章主要就是針對這一問題給出的答案,以下就是主要內容描述。
1 .提交執行時間長的查詢。
長時間運行的查詢會阻塞其它查詢。例如,影響很多行的 DELETE 或 UPDATE
操作能獲取很多鎖,這些鎖不論是否升級到表鎖都阻塞其它查詢。因此,一般不要將長時間運行的決策支持查詢和聯機事務處理 (OLTP)
查詢混在一起。解決方案是想辦法優化查詢,如更改索引、將大的復雜查詢分成簡單的查詢或在空閑時間或單獨的計算機上運行查詢。
2 .查詢不適當地使用游標。游標可能是在結果集中瀏覽的便利方法,但使用游標可能比使用面向集合的查詢慢。
3 .取消沒有提交或回滾的查詢。
如果應用程序取消查詢(如使用開放式數據庫連接 (ODBC) sqlcancel 函數)但沒有同時發出所需數目的 ROLLBACK 和 COMMIT 語句,則會發生這種情況。取消查詢并不自動回滾或提交事務。取消查詢后,所有在事務內獲取的鎖都將保留。應用程序必須提交或回滾已取消的事務,從而正確地管理事務嵌套級。
4 .應用程序沒處理完所有結果。
將查詢發送到服務器后,所有應用程序必須立即完成提取所有結果行。如果應用程序沒有提取所有結果行,鎖可能會留在表上而阻塞其他用戶。如果使用的應用程序將Transact-SQL 語句透明地提交給服務器,則該應用程序必須提取所有結果行。
如果應用程序沒這樣做(如果無法配置它執行此操作),則可能無法解決阻塞問題。為避免此問題,可以將這些應用程序限制在報表或決策支持數據庫上。
5 .分布式客戶端/服務器死鎖。
與常規死鎖不同,分布式死鎖無法由 Microsoft SQL Server? 2000 自動檢測到。如果應用程序打開多個與 SQL Server 的連接并異步提交查詢,則可能會發生分布式客戶端/服務器死鎖。
例如,一個客戶端應用程序線程有兩個開放式連接。該線程異步啟動事務并在***個連接上發出查詢。應用程序隨后啟動其它事務,在另一個連接上發出查詢并等待結果。當 SQL Server 返回其中一個連接的結果時,應用程序開始處理這些結果。
應用程序就這樣處理結果,直到生成結果的查詢被另一個連接上執行的查詢阻塞而導致再沒有可用的結果為止。此時***個連接阻塞,無限期等待處理更多的結果。第二個連接沒有在鎖上阻塞,但仍試圖將結果返回給應用程序。然而,由于應用程序阻塞而在***個連接上等待結果,第二個連接的結果將得不到處理。
以上的相關內容就是對常見的SQL Server阻塞情形的介紹,望你能有所收獲。
上述的相關內容就是對常見的SQL Server阻塞情形的描述,希望會給你帶來一些幫助在此方面。
【編輯推薦】