SHOW PROCESSLIST; -- 找到 State=Locked 或 Time 較大的 Id
KILL ;
SHOW ENGINE INNODB STATUS\G
-- 輸出中 LATEST DETECTED DEADLOCK 區塊會顯示:
-- 1. 兩條互相等待的 SQL
-- 2. 持有/等待的鎖模式(X/S)
-- 3. 事務隔離級別
-- 沒有索引的 WHERE 條件
UPDATE t1 SET val=1 WHERE uid='xxxx'; -- uid 無索引 → 表鎖
解法:為 WHERE、JOIN、ORDER BY 欄位建立索引。
-- Session A
UPDATE t1 SET a=1 WHERE id=1;
UPDATE t1 SET b=2 WHERE id=2;
-- Session B(順序相反)
UPDATE t1 SET b=2 WHERE id=2;
UPDATE t1 SET a=1 WHERE id=1;
解法:應用層統一按主鍵順序存取多行資料。
DELETE FROM t1 WHERE id IN (SELECT id FROM t2 WHERE ...);
解法:改用 JOIN 或拆分為應用層分批處理。
innodb_lock_wait_timeout:預設 50s,可縮短至 10-20s 快速失敗innodb_deadlock_detect=ON:保持開啟(預設)