首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 內部鎖定完整指南:LOCK TABLES 語法、鎖類型與優先級機制

     編輯:MySQL 資料庫相關知識

內部鎖定核心作用

  • 協調多客戶端併發存取(避免 SELECT 被 UPDATE 干擾)
  • 配合維護工具(myisamchk)進行線上檢查/修復,無需停服務

語法速查

-- 加鎖
LOCK TABLES tbl_name {READ | WRITE} [, tbl_name {READ | WRITE} ...];

-- 解鎖
UNLOCK TABLES;

鎖類型與相容性矩陣

鎖類型持有者可做其他線程可做典型場景
READ
READ [LOCAL]
讀取 讀取(LOCAL 允許並發插入) 檢查表、備份、只讀報表
WRITE 讀取、寫入、修改結構 阻塞(不可讀寫) 修復表、大批量寫入、DDL

關鍵行為細節

  • 全有或全無:LOCK TABLES 需一次獲得所有請求的鎖,否則等待(無超時)。
  • 自動釋放:新的 LOCK TABLES、連線關閉、執行緒結束均會釋放當前線程所有鎖。
  • 優先級:WRITE > READ:寫鎖請求插隊到讀鎖之前,確保變更儘快處理。連續讀鎖請求會等待寫鎖釋放。
  • READ LOCAL:MyISAM 支援並發插入(表尾追加),備份工具常用。

標準檢查/修復流程(內部鎖定版)

檢查(需 READ 鎖)

mysql -e "LOCK TABLES tbl READ; FLUSH TABLES;"
myisamchk tbl
mysql -e "UNLOCK TABLES;"

修復/優化(需 WRITE 鎖)

mysql -e "LOCK TABLES tbl WRITE; FLUSH TABLES;"
cp tbl.* /backup/
myisamchk --recover tbl   # 或 OPTIMIZE TABLE tbl
mysql -e "FLUSH TABLES; UNLOCK TABLES;"

注意:修復後必須再次 FLUSH TABLES,讓服務重新載入新的索引檔(.MYI),否則服務仍使用舊快取導致錯誤。

InnoDB 時代的內部鎖定

  • InnoDB 使用行級鎖 + MVCC,LOCK TABLES 仍可用但會降低併發度。
  • 線上 DDL(ALGORITHM=INPLACE)大多無需鎖表。
  • 備份建議用 mysqldump --single-transaction 或 Percona XtraBackup,避免全表鎖。

總結

內部鎖定是 MySQL 服務層協調併發的基礎設施。掌握 LOCK TABLES 與 FLUSH TABLES 的配合,能安全完成 MyISAM 表的線上維護;InnoDB 場景下則應優先使用行級鎖與 MVCC 特性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved