背景
最近給客戶做優(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ǔ)過程 和 程序 中的情況。
存儲(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ù),從而避免了阻塞。