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

MySQL 表鎖、行鎖、意向鎖、事務控制與 Savepoint 完整圖解

     編輯:MySQL 綜合教學

MySQL 表鎖、行鎖、意向鎖、事務控制與 Savepoint 完整圖解

MySQL 鎖系統是併發控制核心。本文系統講解三級鎖 (表/頁/行)、InnoDB 行鎖實現 (記錄鎖/間隙鎖/Next-Key Lock)、意向鎖協議、顯式鎖表語法、事務控制 (BEGIN/COMMIT/ROLLBACK/SAVEPOINT)、鏈式事務、鎖與事務交互實例,附圖解時序圖。

鎖級別對比

級別引擎開銷併發度死鎖
表鎖MyISAM、MEMORY、InnoDB (顯式)最小最低無
頁鎖BDB中等中等有
行鎖InnoDB最大最高有

InnoDB 行鎖三類

  1. Record Lock (記錄鎖):鎖定單個索引記錄 (主鍵/唯一/普通索引)。
  2. Gap Lock (間隙鎖):鎖定索引記錄間的間隙,防止幻讀 (RR 隔離級別)。
  3. Next-Key Lock (臨鍵鎖):Record Lock + Gap Lock,左開右閉區間,InnoDB 默認行鎖類型。

關鍵:只有通過索引條件檢索,InnoDB 才用行鎖;無索引條件退化為表鎖。

意向鎖 (Intent Locks)

  • IS (Intent Shared):事務擬獲取表中某些行的 S 鎖。
  • IX (Intent Exclusive):事務擬獲取表中某些行的 X 鎖。
  • 作用:表級鎖與行級鎖快速衝突檢測,避免掃描全表檢查行鎖。
  • 兼容性:IS/IX 與表級 S/X 互斥,IS/IX 之間兼容。

顯式表鎖語法

LOCK TABLES tbl_name [[AS] alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} [, ...]
UNLOCK TABLES;
  • READ [LOCAL]:共享鎖,LOCAL 允許非衝突並發插入 (MyISAM)。
  • [LOW_PRIORITY] WRITE:排他鎖,LOW_PRIORITY 降低優先級,讓讀請求優先。
  • 會話級:斷開連接自動釋放。

事務控制語法

START TRANSACTION | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET AUTOCOMMIT = {0 | 1}
SAVEPOINT identifier
ROLLBACK TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier
  • CHAIN:提交/回滾後立即啟動新事務,保持隔離級別。
  • RELEASE:斷開客戶端連接。
  • SAVEPOINT:事務內部部分回滾點,可多個、同名覆蓋。

實例時序圖解

例 1:START TRANSACTION + COMMIT AND CHAIN

鏈式事務 事務狀態 驗證

例 2:LOCK TABLES 期間啟動事務隱式 UNLOCK

鎖表與事務交互 隱式解鎖

關鍵規則:在鎖表期間執行 START TRANSACTION 會隱式執行 UNLOCK TABLES,導致表鎖釋放,併發保護失效。

例 3:SAVEPOINT 部分回滾

Savepoint 定義 回滾到 Savepoint

  • 只能回滾到 Savepoint,不能部分提交。
  • 同名 Savepoint 後定義覆蓋前者。
  • RELEASE SAVEPOINT 刪除後不可再回滾。

併發插入 (MyISAM)

concurrent_insert 變量控制:

  • 0:禁止並發插入。
  • 1 (默認):無空洞 (無刪除) 時,讀鎖下允許尾部插入。
  • 2:無論是否有空洞,均允許尾部並發插入。

最佳實踐

  1. 業務代碼儘量不使用 LOCK TABLES,依賴 InnoDB 行鎖 + 事務隔離級別。
  2. 若必須鎖表:LOW_PRIORITY WRITE 避免餓死讀請求;最小化鎖表範圍與時間。
  3. 事務中避免 SELECT 無條件掃描,精準命中索引,縮短鎖持有時間。
  4. 長業務拆分小事務,或用應用層補償 (TCC/Saga) 替代長事務。
  5. 死鎖監控:SHOW ENGINE INNODB STATUS 觀察 LATEST DETECTED DEADLOCK,優化索引順序、統一加鎖順序。
鎖是併發的「紅綠燈」,事務是數據一致性的「護城河」。InnoDB 行鎖 + RR 隔離級別 + Next-Key Lock 解決 99% 併發問題。顯式鎖表、Savepoint、鏈式事務是特殊場景的手術刀,日常開發極少用到。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved