所有死鎖最深層原因:**資源競爭**。兩類典型表現:
-- 用戶 A
BEGIN TRAN
UPDATE TableA SET ... WHERE ... -- 鎖 TableA
UPDATE TableB SET ... WHERE ... -- 等待 TableB
COMMIT
-- 用戶 B (同時)
BEGIN TRAN
UPDATE TableB SET ... WHERE ... -- 鎖 TableB
UPDATE TableA SET ... WHERE ... -- 等待 TableA
COMMIT
雙方各持一鎖、互待對方 → 死鎖。
-- 用戶 A (交易)
SELECT * FROM Table WHERE id = 1; -- 取得共享鎖 (S)
-- ... 業務邏輯 ...
UPDATE Table SET col = val WHERE id = 1; -- 嘗試 S → X 升級
-- 用戶 B (同時)
UPDATE Table SET col = val2 WHERE id = 1; -- 直接取得 X,因 A 持有 S 而等待
A 等 B 釋放 X 以升級,B 等 A 釋放 S 以取得 X → **死鎖**。
SELECT * FROM Table WITH (UPDLOCK) WHERE id = 1;
SET LOCK_TIMEOUT 避免無限等待sys.dm_os_waiting_tasks + sys.dm_tran_locks 即時診斷 (SQL 2005+)READ_COMMITTED_SNAPSHOT (RCSI) 降低讀寫衝突 (需評估 tempdb 壓力)