| 鎖級別 | 引擎 | 開銷 | 加鎖速度 | 死鎖 | 粒度 | 並發度 |
|---|---|---|---|---|---|---|
| 表級鎖 | MyISAM, MEMORY | 小 | 快 | 無 | 大 | 最低 |
| 頁面鎖 | BDB | 中 | 中 | 有 | 中 | 一般 |
| 行級鎖 | InnoDB (默認) | 大 | 慢 | 有 | 小 | 最高 |
SELECT ... LOCK IN SHARE MODE)。SELECT ... FOR UPDATE、UPDATE、DELETE)。兼容性矩陣:S 與 S 兼容,S 與 X、X 與 X 均互斥。
InnoDB 通過 多版本並發控制 (MVCC) 實現:讀取操作不等待行鎖釋放,而是讀取數據的快照版本(由 Undo Log 構建)。
非鎖定讀極大提升並發性,但在以下場景會隱式加鎖:
SELECT ... FOR UPDATE、LOCK IN SHARE MODE。若表無顯式索引,InnoDB 使用隱式主鍵加鎖。
解決:對讀取記錄加排他鎖,將並發操作串行化。
讀到未提交數據,僅發生於 READ UNCOMMITTED 級別。
同一事務兩次讀取同一行數據不一致(被其他事務修改提交)。InnoDB 通過 Next-Key Lock 避免。
同一查詢條件下,重新讀取發現新增滿足條件的行。RR 級別下 Next-Key Lock 可解決大部分幻讀。
常見四種死鎖形式:雙表交叉鎖、同表主鍵索引沖突、主鍵與非聚簇索引沖突、鎖升級導致等待隊列阻塞。
INSERT ... SELECT 改用 SELECT INTO OUTFILE + LOAD DATA INFILE。WHERE 條件統一使用主鍵或索引,避免混用導致鎖順序不一致。SHOW PROCESSLIST 找到阻塞線程 ID,KILL 掉。SHOW ENGINE INNODB STATUS 查看最近死鎖詳情(持有鎖、等待鎖、SQL 文本)。information_schema.innodb_trx、innodb_locks、innodb_lock_waits 表分析當前事務與鎖等待鏈。