背景
最近給客戶做優化時,有幾個客戶都存在.sleeping 會話中開啟了事務,導致的大量阻塞,從而產生嚴重的效能問題。雖然在之前的文章我分享了sleeping會話導致阻塞原理(上) 。說明了什麼是sleeping會話,以及他可能導致的問題。但是對如何解決問題,給出的方案,還是太簡單了,沒有給出解決的細節。本文將對這些細節進行說明。希望大家面對類似問題時更容易下手
下面分享2個案例,分別針對針對問題來著儲存過程 和 程式 中的情況。
儲存過程
以下是某醫藥公司的案例截圖:
從圖中可以看到,230 處於sleeping 狀態並且產生了大量的阻塞。檢視子語句可以知道230執行的是乙個儲存過程。
問題就在於:在這個儲存過程中,開啟事務(如下圖所示),並且執行到後面某個語句時出錯了(可能是超時,或者其他錯誤)。但是開啟的事務並沒有回滾.如下圖
有的同學,可能知道,在儲存過程中 加入tray catch ,出錯時回滾事務。這個解決辦法並不徹底。對應有些錯誤是無法捕捉,對應這種情況,,我們可以在儲存過程中直接加上:set xact_abort on 。當儲存過程執行時發生問題時,會自動回滾所有事務,從而避免了阻塞。
程式這是某製造行業的財務的案例截圖:
檢視子語句,和父語句都是單獨的乙個查詢,說明3185 開啟的事務來著 程式0
對應這種情況,只能修改程式。因為客戶的**不好分享,下面是我自己寫的測試程式**:
在修改時有幾個細節需要注意:
1.在**中加入try catch。
2.在cathc 中必須使用close,dispose 來關閉連線,當然使用了using也是可以的
3.程式建立了新的連線,並執行了查詢。此時會出現 sp_reset_connection事件,此時,事務會被回滾。注意 。兩次建立連線的connectsting.就是連線字串必須完全一致。多個;都不可以。
只有滿足上面3個條件,,sleeping狀態的的會話對應是事務才會被回滾。從而解除上面的阻塞。
總結在解決實際問題時,在知道解決辦法後,還有很多技術細節,這是我們必須要關注的
Sleeping會話導致阻塞原理(下)
最近給客戶做優化時,有幾個客戶都存在.sleeping 會話中開啟了事務,導致的大量阻塞,從而產生嚴重的效能問題。雖然在之前的文章我分享了sleeping會話導致阻塞原理 上 說明了什麼是sleeping會話,以及他可能導致的問題。但是對如何解決問題,給出的方案,還是太簡單了,沒有給出解決的細節。本...
Sleeping會話導致阻塞原理(上)
我在處理客戶問題的時候,客戶經常搞不懂sleeping 的由來,和他可能導致的問題。下面來詳細說下 其實我們經常可以在資料庫中看到 sleeping 狀態的連線,但是這個sleeping 的狀態是怎麼來的,如果有很多sleeping狀態的連線對資料庫有什麼影響嗎?sleeping 代表建立了資料庫連...
什麼導致執行緒阻塞?
導致執行緒阻塞的原因主要有以下幾方面。1 執行緒進行了休眠 執行緒執行了thread.sleep int n 方法,執行緒放棄cpu,睡眠n毫秒,然後恢復執行。2 執行緒要執行一段同步 由於無法獲得相關的同步鎖,只好進入阻塞狀態,等到獲得了同步鎖,才能恢復執行。3 執行緒執行wait 進入阻塞狀態 ...