【賽迪網-IT技術報道】當來自應用程式的第一個連接控制鎖而第二個連接需要相衝突的鎖類型時,將發生阻塞。其結果是強制第二個連接等待,而在第一個連接上阻塞。不管是來自同一應用程式還是另外一台客戶機上單獨的應用程式,一個連接都可以阻塞另一個連接。
說明一些需要鎖保護的操作可能不明顯,例如系統目錄表和索引上的鎖。
大多數阻塞問題的發生是因為一個進程式控制制鎖的時間過長,導致阻塞的進程鏈都在其他進程上等待鎖。
常見的阻塞情形包括:
◆提交執行時間長的查詢。
長時間運行的查詢會阻塞其他查詢。例如,影響很多行的 DELETE 或 UPDATE 操作能獲取很多鎖,這些鎖不論是否升級到表鎖都阻塞其他查詢。因此,一般不要將長時間運行的決策支援查詢和連線事務處理 (OLTP) 查詢混在一起。解決方案是想辦法優化查詢,如更改索引、將大的複雜查詢分成簡單的查詢或在空閒時間或單獨的電腦上運行查詢。
查詢運行時間長並由此導致阻塞的一個原因是這些查詢不適當地使用遊標。遊標可能是在結果集中瀏覽的便利方法,但使用遊標可能比使用面向集合的查詢慢。
◆取消沒有提交或回滾的查詢。
如果應用程式取消查詢(如使用開放式數據庫連接 (ODBC) sqlcancel 函數)但沒有同時發出所需數目的 ROLLBACK 和 COMMIT 語句,則會發生這種情況。取消查詢並不自動回滾或提交事務。取消查詢後,所有在事務內獲取的鎖都將保留。應用程式必須提交或回滾已取消的事務,從而正確地管理事務嵌套級。
◆應用程式沒處理完所有結果。
將查詢發送到伺服器後,所有應用程式必須立即完成提取所有結果行。如果應用程式沒有提取所有結果行,鎖可能會留在表上而阻塞其他用戶。如果使用的應用程式將 Transact-SQL 語句透明地提交給伺服器,則該應用程式必須提取所有結果行。如果應用程式沒這樣做(如果無法配置它執行此操作),則可能無法解決阻塞問題。為避免此問題,可以將這些應用程式限制在報表或決策支援數據庫上。
◆分佈式客戶端/伺服器死鎖。
與常規死鎖不同,分佈式死鎖無法由 Microsoft® SQL Server™ 2000 自動檢測到。如果應用程式打開多個與 SQL Server 的連接並異步提交查詢,則可能會發生分佈式客戶端/伺服器死鎖。
例如,一個客戶端應用程式線程有兩個開放式連接。該線程異步啟動事務並在第一個連接上發出查詢。應用程式隨後啟動其他事務,在另一個連接上發出查詢並等待結果。當 SQL Server 返回其中一個連接的結果時,應用程式開始處理這些結果。應用程式就這樣處理結果,直到生成結果的查詢被另一個連接上執行的查詢阻塞而導致再沒有可用的結果為止。此時第一個連接阻塞,無限期等待處理更多的結果。第二個連接沒有在鎖上阻塞,但仍試圖將結果返回給應用程式。然而,由於應用程式阻塞而在第一個連接上等待結果,第二個連接的結果將得不到處理。
若要避免此問題,請執行下列任一操作:
●對每個查詢使用查詢超時。
●對每個查詢使用鎖定超時。
●使用綁定連接。
1
2
下一頁>>