本文系統梳理 InnoDB 鎖體系,涵蓋四大隔離級別、並發調度、兩階段鎖協議、死鎖成因、鎖類型與粒度、相容矩陣、常用診斷 SQL、典型語句鎖行為分析,作為 DBA 開發與運維的速查手冊。
| 級別 | 髒讀 | 不可重複讀 | 幻讀 | 並發度 |
|---|---|---|---|---|
| READ UNCOMMITTED (RU) | 可能 | 可能 | 可能 | 最高 |
| READ COMMITTED (RC) | 不可能 | 可能 | 可能 | 高 |
| REPEATABLE READ (RR, 預設) | 不可能 | 不可能 | InnoDB 以 Gap Lock 解決 | 中 |
| SERIALIZABLE | 不可能 | 不可能 | 不可能 | 最低 |
生產環境常用 RC(高併發、可接受幻讀)或 RR(預設、強一致性)。
多事務循環等待對方持有的資源。InnoDB 自動偵測並回滾代價最小的事務(權重由 trx_weight 決定,通常是修改行數較少者)。
| 分類 | 類型 | 說明 |
|---|---|---|
| 按模式 | S Lock (共享鎖) | 讀鎖,相容 |
| X Lock (排他鎖) | 寫鎖,互斥 | |
| IS Lock (意向共享) | 表級,意圖加行級 S | |
| IX Lock (意向排他) | 表級,意圖加行級 X | |
| 按粒度 | Record Lock | 鎖定索引記錄 |
| Gap Lock | 鎖定索引間隙(僅 RR) | |
| Next-Key Lock | Record + Gap(RR 預設) | |
| 表鎖 | MySQL Server 層、MDL、FLUSH TABLES | 鎖定整張表 |
| X | S | IX | IS | |
|---|---|---|---|---|
| X | N | N | N | N |
| S | N | Y | N | Y |
| IX | N | N | Y | Y |
| IS | N | Y | Y | Y |
SHOW ENGINE INNODB STATUS \G
查看 LATEST DETECTED DEADLOCK 區塊。
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;
SHOW VARIABLES LIKE 'transaction_isolation';
| SQL 模式 | 表級鎖 | 行級鎖 | 備註 |
|---|---|---|---|
SELECT ... LOCK IN SHARE MODE | IS | 記錄 S Lock | 共享鎖 |
SELECT ... FOR UPDATE | IX | 記錄 X Lock | 排他鎖 |
INSERT ... SELECT / CREATE TABLE ... SELECT | IX / S | 來源表:RR 加 Gap/Next-Key 防幻讀;RC 不加鎖 | RR 需防幻讀 |
FLUSH TABLES WITH READ LOCK | 全域讀鎖 | - | mysqldump 使用 |
UPDATE/DELETE WHERE | IX | 走索引→Record X;全掃→聚簇索引每行 X(等同表鎖) | 必須走索引 |
SELECT ... FOR UPDATE/LOCK IN SHARE MODE 為當前讀會加鎖。