InnoDB 採用多粒度鎖策略,包含四種核心鎖類型:
| 鎖類型 | 俗稱 | 層級 | 說明 |
|---|---|---|---|
| 共享鎖 (S Lock) | 讀鎖 | 行級 | 持有者可讀,不可改;其他事務可加 S 鎖,不可加 X 鎖。 |
| 排他鎖 (X Lock) | 寫鎖 | 行級 | 持有者可讀可改;其他事務不可加任何鎖。 |
| 意向共享鎖 (IS Lock) | 表級意向鎖 | 表級 | 事務欲對表中行加 S 鎖前,必須先對表加 IS (或更強的 IX)。 |
| 意向排他鎖 (IX Lock) | 表級意向鎖 | 表級 | 事務欲對表中行加 X 鎖前,必須先對表加 IX。 |
SELECT ... LOCK IN SHARE MODE:先加表級 IS 鎖,成功後對符合條件的行加 S 鎖。SELECT ... FOR UPDATE:先加表級 IX 鎖,成功後對行加 X 鎖。| X | IX | S | IS | |
|---|---|---|---|---|
| X | ✗ | ✗ | ✗ | ✗ |
| IX | ✗ | ✓ | ✗ | ✓ |
| S | ✗ | ✗ | ✓ | ✓ |
| IS | ✗ | ✓ | ✓ | ✓ |
SELECT * FROM t WHERE i=1 LOCK IN SHARE MODE → 表加 IS,行 (i=1) 加 S。DELETE FROM t WHERE i=1 → 表加 IX (與 IS 相容),行嘗試加 X → 被 S1 的 S 鎖阻塞,等待。DELETE FROM t WHERE i=1 → 表加 IX (與 S2 的 IX 相容),行嘗試加 X → 發現 S2 持有 IX (IX 與 X 衝突) → 等待。理解意向鎖的存在意義:讓表級鎖能快速判斷是否有事務已鎖定表中任意行,避免掃描全表行鎖。