為什麼sleeping的會話會造成阻塞(2)
背景
客戶反饋系統 突然從11:10開始執行非常緩慢,在SQL專家雲中看到大量的產生阻塞的活動會話,KILL掉阻塞的源頭馬上又出現新的源頭,實在沒有辦法只能重啟應用程式斷開所有資料庫連線才解決,請我們協助分析根本的原因。
現象 1
登入SQL專家雲,進入趨勢分析頁面,下鑽到11點鐘內一個小時的資料,看到從11:12開始出現阻塞,越來越嚴重。
分析
2
狀態為sleeping代表當前會話沒有執行SQL請求,之所以造成阻塞是因為會話以前開啟了一個或多個事務, 在事務中修改了一個或多個表的資料,會話對這些修改的資料行持有排他鎖, 從 而阻塞其 他會話對該表的 操作。如果這種狀態持續很長時間,很有可能是前端應用程式出現了異常,並且 沒有健壯的異常處理機制,出錯後沒有回滾以前開啟的事務並關閉連線,導致阻塞一直存在。 前端應用程式出錯原因主要有兩種,一種是執行SQL語句時被阻塞等原因導致執行時間長併產生超時;一種是執行非資料庫訪問邏輯時因為某些原因出錯了,例如轉換資料型別失敗、接收資料量太大導致記憶體溢位、訪問別的介面報錯等。
本著這個經驗,對這些sleeping的會話進行回溯,發現這些會話在sleeping之前,都曾經被阻塞過很長時間,根據慢語句的特徵判斷是執行超時了。
而且這些會話都存在開啟的事務,事務開始時間都在執行
語句超時的時間之前。
透過對儲存過程進行分析,發現裡面在用 TRY CATCH的方式處理事務,因此推斷該方式無法捕獲應用程式端的超時錯誤,導致事務和連線的洩露,因為儲存過程比較複雜,下面用一個測試來模擬
測試
3
CREATE PROCEDURE dbo.usp_testAS BEGIN TRAN BEGIN TRY UPDATE dbo.Table_2 WITH(ROWLOCK) SET a = 'wang' UPDATE dbo.Table_1 WITH(ROWLOCK) SET a = 'wang' END TRY BEGIN CATCH IF @@ERROR = 0 BEGIN GOTO succeed END ELSE BEGIN GOTO error END END CATCH succeed: COMMIT TRAN RETURN 1 error: ROLLBACK TRAN RETURN 0
新建一個查詢,開始一個事務,然後執行UPDATE Table_1,不提交或者回滾事務,對錶Table_1的排他鎖一直存在, 用來模擬對錶Table_1的鎖定。
新建另一個查詢,注意,執行超時值設定為30秒(預設是0,代表永不超時)。
這個新建立的會話ID是56。
新建一個查詢,檢視會話56的事務資訊,可以看到存在一個開啟的事務。
再透過sys.dm_tran_locks可以看到會話56還保持著對錶Table_2和Table_1的意向排他鎖以及Table_2上 更改 的兩行資料的排他鎖。 此時在其他會話中 對 T a bl e _ 2 執 行 查 詢和修改 ,都 被 會 話 5 6 阻 塞 。
總結: “超時”錯誤是應用程式端的異常,資料庫驅動程式執行SQL語句時等待伺服器端的響應,等待時間達到設定的閾值後傳送一個終止執行的訊號給伺服器端並向上層應用程式丟擲異常。伺服器 端接收到該訊號後終止語句的執行,並不會報錯,TRY CATCH是無法捕獲的 ,因此無法執行到 SUCCEED處的COMMIT或者 ERROR處的ROLLBACK,導致了事務的洩露,該事務中的對錶Table_2的排他鎖一直持有,其他會話對錶Table_2的操作會被阻塞,直到殺掉該會話。
解決
4
但是很多客戶是購買軟體廠商的產品,修改程式不容易實現或者週期很長。因此只能在資料庫端進行補償性的措施,就是配置一個自動查殺會話的作業,根據sleeping會話的特徵定期KILL掉。也可以在SQL專家雲中啟用自動查殺會話的功能。
北京格瑞趨勢科技有限公司是聚焦於資料服務的高新技術企業,成立於2008年,創始團隊及核心技術人員來自微軟和雅虎。微軟資料平臺金牌合作伙伴,衛寧健康資料平臺戰略合作伙伴。透過產品+服務雙輪驅動的業務模式,14年間累計服務4000+客戶,覆蓋網際網路、市政、交通、電信、醫療、教育、電力、製造業等各個領域。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70023658/viewspace-2935726/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 為什麼sleeping的會話會造成阻塞會話
- css的載入會阻塞js執行嗎?為什麼?CSSJS
- Oracle阻塞會話查詢Oracle會話
- SQLServer如何監控阻塞會話SQLServer會話
- 什麼是RCE漏洞?會造成哪些危害?
- 什麼是檔案包含漏洞?會造成什麼危害?
- css的載入會阻塞DOM樹解析和渲染嗎?為什麼?CSS
- MySQL的共享鎖阻塞會話案例淺析MySql會話
- 什麼情況下會出現css阻塞?CSS
- 什麼情況下會出現js阻塞?JS
- 大白話搞懂什麼是同步/非同步/阻塞/非阻塞非同步
- 豆瓣為什麼會崩?
- ssl會話建立的過程(原理)是什麼?會話
- Python能幹什麼?為什麼會火?Python
- Linux中tcp連線數過多會造成什麼影響?LinuxTCP
- 大資料分析為什麼大多數會失敗?(2)大資料
- 因果迷境:為什麼我們會問“為什麼”?
- 3 * 0.1 == 0.3將會返回什麼?為什麼?
- 跑批為什麼會這麼難?
- Python能幹什麼?為什麼會這麼火?Python
- Python 的切片為什麼不會索引越界?Python索引
- 網站為什麼會存在漏洞網站
- 為什麼Kubernetes會消失 - David Carboni
- 為什麼 JavaScript 會無處不在?JavaScript
- 為什麼Web 設計會“死”?Web
- 服務為什麼會崩潰
- 垂直margin為什麼會重疊
- 為什麼js會有閉包JS
- 為什麼Laravel會成為最成功的PHP框架LaravelPHP框架
- 人是什麼?人生是什麼?人為什麼會變?
- 管理工具造成的阻塞
- 主執行緒中的Looper.loop()一直無限迴圈為什麼不會造成ANR?執行緒OOP
- 為什麼會有這麼多的程式語言?
- Application.onCreate()會造成Service啟動ANR麼?APP
- MySQL的共享鎖阻塞會話案例淺析輸入日誌標題MySql會話
- 為什麼我會重回到Windows的懷抱?Windows
- 網站為什麼會打不開網站
- 為什麼評論會被摺疊?