大家好,今天第 23 天啦 ~
之前曾經遇到資料庫死結的狀況 ~ 在檢查 SQL 語法發生死結的原因時,發現是鎖定擴大 (Lock Escalation,或稱鎖定升級) 造成死結,究竟是怎麼回事呢?
首先,先觀察死結的發生狀況。
參考資料: [SQL]紀錄 SQL Server 死結( Deadlock ) 的方法 - 五餅二魚工作室 - 點部落
從 SQL Profiler 觀察到 Lock Escalation (鎖定擴大) 事件時,可對照 Lock:Escalation Event Class - SQL Server - Microsoft Learn 檢查鎖定的類型 (Type),以 Table Lock 來說, Type 會是 5 = OBJECT (table level)
。
鎖定擴大事件會將目前的鎖定層級提高。比如說 DELETE
或 UPDATE
作業通常是 Row Lock
,當 SQL Server 因為存取量過大,而執行鎖定擴大時,將由 Row Lock
提升至 Table Lock
。若此時有其它語法同時存取同一個 Table,有機會造成死結。
參考資料: Lock Escalation (Database Engine) - Microsoft Learn
避免鎖定擴大的方法有以下幾種:
WAITFOR DELAY
關鍵字,可以使特定資料表保持 IX Lock
(內部互斥鎖) 一段時間,避免鎖定擴大的發生。參考資料 (MSDN): Prevent lock escalation