Sql Server 阻塞的常見原因和解決辦法

2021-09-08 02:27:22 字數 2113 閱讀 9501

阻塞的常見原因和解決辦法:

1. 由於語句執行時間太長而導致的阻塞,語句本身在正常執行中,只須等待某些系統資源

解決辦法:

a. 語句本身有沒有可優化的空間

b. sql server 整體效能如何,是不是有資源瓶頸影響了語句執行速度,如 記憶體、硬碟 和 cpu 等

2. 由於乙個未按預期提交的事務導致的阻塞

這一類阻塞的特徵,就是問題連線早就進入了空閒狀態(sysprocesses.status='sleeping'和sysprocesses.cms='awaiting command'),但是,如果檢查 sysprocesses.open_tran,就會發現它不為0,以及事務沒有提交。這類問題很多都是因為應用端遇到了乙個執行超時,或者其他原因,當時執行的語句倍提前終止了,但是連線還保留著。應用沒有跟隨發來的事務提交或回滾指令,導致乙個事務被遺留在 sql server 裡。

解決辦法:

應用程式本身必須意識到任何語句都有可能遇到意外終止的情況,做好錯誤處理工作。這些工作包括:

· 在做 sql server 呼叫的時候,須加上錯誤捕捉和處理語句:if @@trancount>0 rollback tran;(在程式中設定if @@error<>0 rollback tran; 並不總是能執行到該語句)

· 設定連線屬性"set xact_abort on"。如果沒有辦法很規範應用程式的錯誤撲捉和處理語句,乙個最快的方法就是在每個連線建立以後,或是容易出問題的儲存過程開頭,執行 "set xact_abort on"

·考慮是否要關閉連線池。發一句 sp_reset_connection 命令清理當前連線上次遺留下來的所有物件,包括回滾未提交的事務。

3. 由於客戶端沒有及時把結果集取出而導致的語句長時間執行

語句在 sql server 內執行總時間不僅包含 sql server 的執行時間,還包含把結果集發給客戶端的時間。如果結果集比較大,sql server 會分幾次打包發出,沒發一次,都要等待客戶端的確認。只有確認以後,sql server 才會傳送下乙個結果集包。所有結果都發完以後,sql server才認為語句執行完畢,釋放執行申請的資源(包括鎖資源)。如果出於某種原因,客戶端應用處理結果非常緩慢甚至沒有響應,或者乾脆不理睬 sql server 傳送結果集的請求,則 sql server 會耐心的等待,銀次會導致語句長時間執行而產生阻塞。

解決辦法:

a. 慎重返回大結果集

b. 如果a短期內不能實現,則嘗試大結果集的連線使用 read uncommitted 事務隔離級別,這樣查詢就不會申請 s 鎖了

4. 阻塞的源頭一直處於 rollback 狀態

這種情況是由第一類情況衍生來的。有時候發現乙個連線阻塞住了別人,為了解決問題,直接讓連線主動退出或強制退出(直接 kill 連線)。對於大部分情況,這些措施會消除阻塞。但是也有例外。在連線退出的時間,為了維護資料庫事務的一致性, sql server都會對連線還沒有來得及完成提交的事務做回滾動作。sql server要找到所有當前事務修改過的記錄,把它們改回原來的狀態。所以,如果乙個 delete、insert 或 update 執行了1個小時,可能回滾也需要乙個小時。

有些使用者可能等不及,直接重啟 sql server。當 sql server 關閉的時候,回滾動作會被中斷,sql server 會被很快關掉。但是這個回滾動作在下次 sql server 重啟的時候會重新開始。重啟的時候如果回滾不能很快結束,整個資料庫都會不可用。

解決辦法:

最好的方法是在工作時間盡量不要做這種大的修改操作。這些操作要盡量安排在半夜或週末的時間完成。如果操作已經進行了很久,最好耐心等它做完。如果一定要在有工作負荷的時候做,最好把乙個大操作分成若干小操作分布完成

5. 應用程式中產生死鎖

sql server 鎖資源模式詳解

sql server 2008 r2 連線數過高的解決辦法

利用 sys.sysprocesses 檢查 sql server的阻塞和死鎖

sql server 阻塞的常見原因和解決辦法

Sql Server 阻塞的常見原因和解決辦法

阻塞的常見原因和解決辦法 1.由於語句執行時間太長而導致的阻塞,語句本身在正常執行中,只須等待某些系統資源 解決辦法 a.語句本身有沒有可優化的空間 b.sql server 整體效能如何,是不是有資源瓶頸影響了語句執行速度,如 記憶體 硬碟 和 cpu 等 2.由於乙個未按預期提交的事務導致的阻塞...

sqlserver死鎖阻塞

create proc p lockinfo kill lock spid bit 1,是否殺掉死鎖的程序,1 殺掉,0 僅顯示 show spid if nolock bit 1 如果沒有死鎖的程序,是否顯示正常程序資訊,1 顯示,0 不顯示 as declare count int,s nvar...

sql server 阻塞查詢

原文 sql server 阻塞查詢 在生產環境下,有時公司客服反映網頁半天打不到,除了在瀏覽器按f12的network響應來排查,確定web伺服器無故障後。就需要檢查資料庫是否有出現阻塞 當時資料庫的生產環境中主表資料量超過2000w,子表資料量超過1億,且更新和新增頻繁。再加上做了同步映象,很消...