MySQL 的鎖機制主要分為三大類,各有優劣,適用場景截然不同:
MyISAM 僅支援表鎖,其讀寫鎖的互斥規則如下:
會話 1 執行 LOCK TABLES t READ 後,會話 2 的 SELECT 可立即返回,但 INSERT/UPDATE/DELETE 會處於「Waiting for table metadata lock」狀態。釋放會話 1 的鎖後,會話 2 的寫操作方能繼續。




InnoDB 透過索引項實現行鎖,核心原則:只有透過索引條件檢索資料,才會使用行級鎖;否則退化為表鎖。
兩個會話同時更新同一條記錄(走主鍵索引),第二個會話會進入鎖等待,直到第一個會話提交或回滾。



若 WHERE 條件未使用索引(如全表掃描),InnoDB 會對整張表加鎖,嚴重降低並發度。


經典死鎖場景:會話 1 鎖住記錄 A 再請求記錄 B,會話 2 鎖住記錄 B 再請求記錄 A。





InnoDB 內建死鎖檢測器,會自動選擇一個受害者事務回滾(通常是修改較少的事務),另一事務繼續執行。死鎖無法完全避免,但可透過統一資源訪問順序、縮短事務長度、適當降低隔離級別等手段降低發生率。