最近給客戶做優(yōu)化時(shí),有幾個(gè)客戶都存在.SLEEPING 會(huì)話中開啟了事務(wù),導(dǎo)致的大量阻塞,從而產(chǎn)生嚴(yán)重的性能問題。雖然在之前的文章我分享了Sleeping會(huì)話導(dǎo)致阻塞原理(上) 。說明了什么是Sleeping會(huì)話,以及他可能導(dǎo)致的問題。但是對如何解決問題,給出的方案,還是太簡單了,沒有給出解決的細(xì)節(jié)。本文將對這些細(xì)節(jié)進(jìn)行說明。希望大家面對類似問題時(shí)更容易下手
下面分享2個(gè)案例,分別針對針對問題來著存儲(chǔ)過程 和 程序 中的情況。
以下是某醫(yī)藥公司的案例截圖:
從圖中可以看到,230 處于SLEEPING 狀態(tài)并且產(chǎn)生了大量的阻塞。查看子語句可以知道230運(yùn)行的是一個(gè)存儲(chǔ)過程。
問題就在于:在這個(gè)存儲(chǔ)過程中,開啟事務(wù)(如下圖所示),并且運(yùn)行到后面某個(gè)語句時(shí)出錯(cuò)了(可能是超時(shí),或者其他錯(cuò)誤)。但是開啟的事務(wù)并沒有回滾.
有的同學(xué),可能知道,在存儲(chǔ)過程中 加入tray catch ,出錯(cuò)時(shí)回滾事務(wù)。這個(gè)解決辦法并不徹底。對應(yīng)有些錯(cuò)誤是無法捕捉,對應(yīng)這種情況,,我們可以在存儲(chǔ)過程中直接加上:SET XACT_ABORT ON 。當(dāng)存儲(chǔ)過程執(zhí)行時(shí)發(fā)生問題時(shí),會(huì)自動(dòng)回滾所有事務(wù),從而避免了阻塞。
這是某制造行業(yè)的財(cái)務(wù)的案例截圖:
查看子語句,和父語句都是單獨(dú)的一個(gè)查詢,說明3185 開啟的事務(wù)來著 程序0
對應(yīng)這種情況,只能修改程序。因?yàn)榭蛻舻拇a不好分享,下面是我自己寫的測試程序代碼:
在修改時(shí)有幾個(gè)細(xì)節(jié)需要注意:
1.在代碼中加入TRY CATCH。
2.在CATHC 中必須使用close,dispose 來關(guān)閉連接,當(dāng)然使用了using也是可以的3.程序建立了新的連接,并執(zhí)行了查詢。此時(shí)會(huì)出現(xiàn) sp_reset_connection事件,此時(shí),事務(wù)會(huì)被回滾。注意 。兩次建立連接的connectsting.就是連接字符串必須完全一致。多個(gè);都不可以。
只有滿足上面3個(gè)條件,,sleeping狀態(tài)的的會(huì)話對應(yīng)是事務(wù)才會(huì)被回滾。從而解除上面的阻塞。
在解決實(shí)際問題時(shí),在知道解決辦法后,還有很多技術(shù)細(xì)節(jié),這是我們必須要關(guān)注的
新聞熱點(diǎn)
疑難解答
圖片精選