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

MySQL 表鎖機制詳解:內部鎖與外部鎖、LOCK TABLES 實戰與維護協議

     編輯:MySQL 綜合教學

兩種鎖機制

特性內部鎖外部鎖
層級表級(MySQL 服務層管理)檔案級(OS 檔案系統鎖)
用途客戶端請求隔離、維護操作協調防止其他進程(myisamchk/cp)修改檔案
引擎相關所有引擎主要 MyISAM/ISAM
啟用控制永遠啟用--skip-locking 可禁用(Linux 預設關閉)

內部鎖:LOCK TABLES 語法

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

-- 解鎖
UNLOCK TABLES

鎖類型行為

優先級規則:WRITE 等待隊列優先於 READ,避免寫入飢餓。

自動釋放場景

  • 連線斷開
  • 執行新的 LOCK TABLES
  • 執行 UNLOCK TABLES

維護操作鎖協議

檢查表(僅讀)

mysql> LOCK TABLE tbl_name READ;
mysql> FLUSH TABLES;  -- 關閉檔案、刷新快取到磁碟
# 另一終端
$ myisamchk tbl_name
# 完成後
mysql> UNLOCK TABLES;

修復/優化表(需寫入)

mysql> LOCK TABLE tbl_name WRITE;
mysql> FLUSH TABLES;

# 備份原檔
$ cp tbl_name.* /backup/

# 修復
$ myisamchk --recover tbl_name
# 或優化
$ myisamchk --analyze tbl_name

# 重新載入索引快取
mysql> FLUSH TABLES;
mysql> UNLOCK TABLES;

外部鎖協議

# 檢查外部鎖狀態
mysqladmin variables | grep skip_locking

# skip_locking = OFF:外部鎖啟用
# 可直接執行 myisamchk,服務與工具協作

# skip_locking = ON:外部鎖禁用
# 必須用內部鎖協議,或停止服務

InnoDB 差異說明

  • InnoDB 使用行級鎖,LOCK TABLES 仍會加表級鎖但極少使用
  • 維護操作:CHECK TABLE、OPTIMIZE TABLE、ANALYZE TABLE 線上執行,無需手工加鎖
  • 備份建議:mysqldump --single-transaction 或 Percona XtraBackup 熱備份

最佳實踐

  1. 應用層避免使用 LOCK TABLES,用行級鎖/交易控制並發
  2. 維護窗口期執行 DDL/優化,配合 pt-online-schema-change 線上變更
  3. MyISAM 表定期 mysqlcheck -A --auto-repair
  4. 監控 SHOW OPEN TABLES WHERE In_use > 0 發現長鎖
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
鎖類型持有者權限其他連線權限優先級
READ可讀可讀,不可寫低
WRITE可讀可寫不可讀不可寫(阻塞)高