首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 鎖機制總結:隔離級別、鎖類型、相容矩陣、死鎖排查與實戰 SQL 鎖分析

     編輯:MySQL 綜合教學

MySQL 鎖機制總結:隔離級別、鎖類型、相容矩陣、死鎖排查與實戰 SQL 鎖分析

本文系統梳理 InnoDB 鎖體系,涵蓋四大隔離級別、並發調度、兩階段鎖協議、死鎖成因、鎖類型與粒度、相容矩陣、常用診斷 SQL、典型語句鎖行為分析,作為 DBA 開發與運維的速查手冊。

一、事務隔離級別

級別髒讀不可重複讀幻讀並發度
READ UNCOMMITTED (RU)可能可能可能最高
READ COMMITTED (RC)不可能可能可能高
REPEATABLE READ (RR, 預設)不可能不可能InnoDB 以 Gap Lock 解決中
SERIALIZABLE不可能不可能不可能最低

生產環境常用 RC(高併發、可接受幻讀)或 RR(預設、強一致性)。

二、並發調度與 MVCC

  • 基於鎖的並發控制:讀寫互斥,寫寫互斥。
  • MVCC(多版本並發控制):讀不加鎖,讀寫不阻塞,大幅提升讀多寫少場景並發度。InnoDB 透過 Undo Log 實現快照讀。

三、兩階段鎖協議 (2PL)

  • 階段一(擴張期):只能獲取鎖,不能釋放。
  • 階段二(收縮期):只能釋放鎖,不能獲取。
  • 保證可序列化調度,但引入死鎖可能。

四、死鎖

多事務循環等待對方持有的資源。InnoDB 自動偵測並回滾代價最小的事務(權重由 trx_weight 決定,通常是修改行數較少者)。

五、鎖類型與粒度

分類類型說明
按模式S Lock (共享鎖)讀鎖,相容
X Lock (排他鎖)寫鎖,互斥
IS Lock (意向共享)表級,意圖加行級 S
IX Lock (意向排他)表級,意圖加行級 X
按粒度Record Lock鎖定索引記錄
Gap Lock鎖定索引間隙(僅 RR)
Next-Key LockRecord + Gap(RR 預設)
表鎖MySQL Server 層、MDL、FLUSH TABLES鎖定整張表

六、鎖相容矩陣 (Y=相容, N=互斥)

XSIXIS
XNNNN
SNYNY
IXNNYY
ISNYYY

七、關鍵診斷 SQL

1. 最近一次死鎖詳情

SHOW ENGINE INNODB STATUS \G

查看 LATEST DETECTED DEADLOCK 區塊。

2. 當前正在等待的鎖

SELECT r.trx_id AS waiting_trx_id, r.trx_query AS waiting_query,
       b.trx_id AS blocking_trx_id, b.trx_query AS blocking_query,
       b.trx_mysql_thread_id AS blocking_thread,
       b.trx_started, b.trx_wait_started
FROM information_schema.innodb_lock_waits w
JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;

3. 查看當前隔離級別

SHOW VARIABLES LIKE 'transaction_isolation';

八、典型 SQL 鎖行為分析

SQL 模式表級鎖行級鎖備註
SELECT ... LOCK IN SHARE MODEIS記錄 S Lock共享鎖
SELECT ... FOR UPDATEIX記錄 X Lock排他鎖
INSERT ... SELECT / CREATE TABLE ... SELECTIX / S來源表:RR 加 Gap/Next-Key 防幻讀;RC 不加鎖RR 需防幻讀
FLUSH TABLES WITH READ LOCK全域讀鎖-mysqldump 使用
UPDATE/DELETE WHEREIX走索引→Record X;全掃→聚簇索引每行 X(等同表鎖)必須走索引

九、實務補充說明

  1. 更新操作必須走索引才可能行鎖;否則對聚簇索引每行加寫鎖,等同表鎖。
  2. 多物理記錄對應同一二級索引值時,並發訪問會產生鎖衝突。
  3. 表有多索引時,不同事務可用不同索引鎖不同行,InnoDB 同時對聚簇索引加鎖。
  4. MVCC 下讀操作不阻塞寫、寫不阻塞讀(快照讀),但 SELECT ... FOR UPDATE/LOCK IN SHARE MODE 為當前讀會加鎖。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved