兩個或多個進程在執行過程中,因爭奪資源造成循環等待,若無外力干預,皆無法推進。系統處於死鎖狀態,涉及進程稱為死鎖進程。
打破任一條件即可避免死鎖。
| 縮寫 | 全稱 | 說明 |
|---|---|---|
| S | Shared | 共享鎖,讀操作,允許並發讀,阻寫 |
| X | Exclusive | 獨占鎖,寫操作,阻讀阻寫,持有到事務結束 |
| U | Update | 更新鎖,搜尋待修改資源時持有,防轉換死鎖,與 S 兼容 |
| IS/IU/IX | Intent Shared/Update/Exclusive | 意向鎖,多粒度鎖協議,標示下層已加鎖 |
| SIX/SIU/UIX | 轉換鎖 | 混合模式,如 S+IX=SIX |
| Sch-S/Sch-M | Schema Stability/Modification | 架構鎖,DDL 操作時持有 |
| BU | Bulk Update | 大量複製配合 TABLOCK 時使用 |
Table → Page → Row / Key / Key-Range。細粒度併發高但開銷大,SQL Server 動態升級(Lock Escalation)。
CREATE VIEW dblocks AS
SELECT request_session_id AS spid,
DB_NAME(resource_database_id) AS dbname,
CASE WHEN resource_type='object' THEN OBJECT_NAME(resource_associated_entity_id)
WHEN resource_associated_entity_id=0 THEN 'n/a'
ELSE OBJECT_NAME(p.object_id) END AS entity_name,
index_id, resource_type AS resource,
resource_description AS description,
request_mode AS mode, request_status AS status
FROM sys.dm_tran_locks t
LEFT JOIN sys.partitions p ON p.partition_id=t.resource_associated_entity_id
WHERE resource_database_id=DB_ID();
Locks → Deadlock graphTSQL → SQL:BatchStarting更新語句使用 Index Scan(索引掃描) 而非 Seek,掃描範圍大、持鎖久、併發衝突概率高。
1205,自動重試(通常二次即成功)死鎖無法 100% 根除,但通過「優化索引縮小鎖範圍 + 統一加鎖順序 + 應用層重試」組合拳,可將影響降至最低。