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

MySQL 鎖機制深度解析:表鎖、行鎖、頁鎖、死鎖與優化策略

     編輯:MySQL 綜合教學

儲存引擎鎖粒度對照

表鎖獲取邏輯(MyISAM)

WRITE LOCK:
  IF 無鎖 → 加寫鎖
  ELSE → 寫鎖隊列等待

READ LOCK:
  IF 無寫鎖 → 加讀鎖
  ELSE → 讀鎖隊列等待

釋放時:優先喚醒寫鎖隊列,再喚醒讀鎖隊列
→ 大量 UPDATE 會阻塞 SELECT

鎖爭用監控

SHOW STATUS LIKE 'Table%';
+-----------------------+---------+
| Variable_name         | Value   |
+-----------------------+---------+
| Table_locks_immediate | 1151552 |  -- 立即獲得
| Table_locks_waited    | 15324   |  -- 等待次數
+-----------------------+---------+
-- 等待比例高 → 考慮拆表、換引擎、優化索引

MyISAM 並行插入優化

  • 資料檔無空洞(無刪除/更新產生空洞)→ 尾部追加,SELECT 不阻塞 INSERT
  • 有空洞 → 並行插入暫停,空洞填滿後自動恢復
  • 不可並行時:寫入臨時表 → LOCK TABLES real WRITE, tmp WRITE; INSERT ... SELECT; TRUNCATE tmp; UNLOCK TABLES

行級鎖優缺點(InnoDB)

引擎鎖粒度死鎖風險
MyISAM / MEMORY表級無(按固定順序獲取)
BDB頁級有
InnoDB行級有
優點缺點
不同行並發衝突極低記憶體開銷大
回滾開銷小大範圍掃描/GROUP BY 比表鎖慢
可長時間鎖定單行頻繁全表操作效能差

表鎖優於行鎖的場景

  • 絕大多數 SELECT,極少 UPDATE/DELETE
  • 主鍵精確 UPDATE/DELETE(單行)
  • 全表掃描/GROUP BY 無寫入

替代方案:MVCC(多版本並發控制)

InnoDB 實際採用 MVCC + 行鎖:讀不阻寫、寫不阻讀,透過版本鏈實現一致性讀。又稱「時間旅行」「寫時複製」。極端情況下記憶體佔用可能超過傳統鎖。

應用層顧問鎖

SELECT GET_LOCK('my_lock', 10);   -- 獲取,超時 10 秒
SELECT RELEASE_LOCK('my_lock');   -- 釋放
-- 僅適用於良性協作應用,非強制
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved