「鎖定是壞事」是常見誤區。實則,為保證數據一致性,數據庫引擎必須通過鎖定機制序列化對共享資源的修改訪問。無鎖定將導致臟寫、幻讀、數據損壞。關鍵在於:合理設計應用,將鎖定粒度、持續時間、並發衝突降至最低。
sp_lock 從 master.dbo.syslockinfo 返回當前所有鎖請求(已授予/轉換/等待)。關鍵列解讀:
| 列名 | 含義 | 關聯查詢 |
|---|---|---|
| spid | 進程 ID,標識連接 | EXEC sp_who @spid |
| dbid | 鎖所在數據庫 ID | SELECT name FROM master..sysdatabases WHERE dbid=... |
| objid | 被鎖對象 ID | SELECT name FROM sysobjects WHERE id=... |
| indid | 索引 ID (0=堆表) | -- |
| type | 鎖類型 (TAB=表, KEY=鍵, PAG=頁, RID=行, EXT=區塊, DB=數據庫) | -- |
| resource | 鎖資源描述 (如頁號、鍵值哈希) | -- |
| mode | 鎖模式 (S=共享, X=排他, U=更新, IS/IX=意向, Sch-S/M=架構) | -- |
| status | GRANT/WAIT/CONVERT | -- |
EXEC sp_lock,若結果超 500-1000 行屬正常高並發場景DBCC INPUTBUFFER(spid) 獲取該 SPID 最後提交的 T-SQL 文本sp_lock 為即時快照工具,歷史趨勢分析請使用:
• 動態管理視圖:sys.dm_tran_locks, sys.dm_os_waiting_tasks
• Performance Monitor:SQLServer:Locks 計數器
• 擴展事件:lock_deadlock, lock_escalation 會話
• 查詢存儲/Profiler:關聯執行計劃與等待統計