SELECT 查詢的客戶端INSERT、UPDATE、DELETE、REPLACE 的客戶端MyISAM、MEMORY 引擎使用表級鎖:
鎖由伺服器自動管理,亦可透過 LOCK TABLES/UNLOCK TABLES 手動控制。
寫操作過程中資料表處於不一致狀態(索引同步更新中),允許並發讀寫會導致髒讀或資料損毀。
| 修飾符 | 適用語句 | 效果 |
|---|---|---|
LOW_PRIORITY | DELETE, INSERT, LOAD DATA, REPLACE, UPDATE | 降低寫操作優先級,讓等待中的讀者優先執行 |
HIGH_PRIORITY | SELECT, INSERT | 提升讀/寫優先級,插隊至等待中的寫者之前 |
DELAYED | INSERT, REPLACE | 資料放入隊列立即返回,背景執行緒稍後寫入 |
LOW_PRIORITY:客戶端阻塞等待,直到寫入完成DELAYED:客戶端立即返回,伺服器背景緩衝處理,不阻塞客戶端風險:DELAYED 寫入前伺服器崩潰會導致資料遺失;無法取得 AUTO_INCREMENT 值;唯一鍵衝突無法即時檢測。
MyISAM 特有機制:當資料檔中間無「空洞」(無刪除/更新產生的碎片) 時,允許 SELECT 讀取同時在檔案尾部 INSERT。
控制參數 concurrent_insert:
0:停用1 (預設):無空洞時允許2:無論是否有空洞皆允許尾部並發插入| 引擎 | 鎖層級 | 並發特性 | 適用場景 |
|---|---|---|---|
| MyISAM | 表級 | 讀多寫少、大量全表掃描 | 報表、日誌、唯讀查詢 |
| BDB | 頁面級 | 中等並發,不同頁面可並發更新 | 較少使用 |
| InnoDB | 行級 | 高並發,不同行可同時更新 | OLTP、高併發寫入、交易處理 |
LOW_PRIORITY 或讀寫分離OPTIMIZE TABLE 減少碎片,提升並發插入機會Table_locks_waited / Table_locks_immediate 評估鎖爭用嚴重度