Sleeping會話導致阻塞原理(下)

2021-07-28 00:11:15 字數 1439 閱讀 8075

最近給客戶做優化時,有幾個客戶都存在.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 進入阻塞狀態 ...