一、按照粒度分類:
粒度越小,并發度越高,鎖開銷越大。
1.全局鎖:
- 作用: 鎖定整個MySQL實例(所有數據庫)。
- 適用場景: 全庫邏輯部分。(確保備份期間數據的一致性。)
- 實現方式: 通過 FLUSH TABLES WITH READ LOCK (FTWRL) 命令實現,加鎖后所有表變為只讀,更新、刪除、插入等操作會被阻塞。
- 注意:InnoDB可通過
mysqldump --single-transaction
結合事務隔離級別避免使用全局鎖(利用MVCC實現一致性讀)。
2.表級鎖:
作用: 鎖定整個表,粒度較大,并發度低,但鎖開銷較小。
-
適用場景: MyISAM存儲引擎默認鎖機制(InnoDB也支持,但更常用行鎖),適合讀多寫少的場景。
-
類型:
- 表讀鎖: 多個事務可以加讀鎖,允許讀表,但阻塞寫操作(包括加寫鎖)。
- 表寫鎖: 一個事務加鎖后,獨占表,阻塞其他所有讀鎖和寫鎖。
-
特點: MyISAM 中寫鎖優先級高于讀鎖,可能導致讀請求餓死(一直等待寫鎖釋放)。
3.行級鎖:
- 作用: 鎖定單行記錄,粒度最小,并發度最高,鎖開銷最大。
- 適用場景: InnoDB存儲引擎的核心鎖機制,適合寫操作頻繁的場景(如電商訂單、庫存更新)。
- 類型:
- 行讀鎖: 事務對某行加讀鎖后,其他事務可以加讀鎖,但不能加寫鎖。
- 行寫鎖: 事務對某行加鎖后,其他事務不能加讀鎖或寫鎖。
- 特點:InnoDB的行鎖基于索引實現,若查詢未命中索引,會升級為表鎖。
二、按鎖的功能劃分:
1.共享鎖(Shared Lock,S鎖):
- 又稱: 讀鎖。
- 特性: 多個事務可以同時持有同一資源的S鎖,允許讀操作,但阻塞寫操作(X鎖)。
- 加鎖方式:
SELECT ... LOCK IN SHARE MODE
(InnoDB 中,顯式加讀鎖)。
2.排他鎖(Exclusive Lock X鎖):
- 又稱:寫鎖。
- 特性:一個事務持有X鎖后,其他事務不能持有該資源的S鎖或X鎖,獨占資源用于寫操作。
- 加鎖方式:
SELECT ... FOR UPDATE;
(InnoDB 中,顯式加寫鎖);默認情況下,UPDATE/DELETE/INSERT 會自動加 X 鎖。
三、InnoDB特有的鎖(基于事務和索引):
1.意向鎖:
- 作用: 表級鎖,用于標識”事務稍后會對表中的行加S鎖或X鎖“,避免表鎖與行鎖的沖突檢查效率問題。
- 類型:
- 意向共享鎖(Intention Shared Lock IS鎖): 事務計劃對表中的某些行加S鎖,加行S鎖前需要先加IS鎖。
- 意向排他鎖(IX鎖): 事務計劃對表中的某些行加X鎖,加行X鎖前需要先加IX鎖。
2.記錄鎖:
- 作用: 鎖定索引記錄本身(具體某一行),防止其他事務修改或刪除該記錄。
- 示例:
WHERE id=10
id是主鍵,InnoDB會鎖定id=10的這一行。
3.間隙鎖:
- 作用:鎖定索引記錄之間的"間隙",不包括記錄本身,防止其他事務在間隙中插入新紀錄。(解決"幻讀"問題)。
- 適用場景:InnoDB的RR隔離級別(默認級別)。
- 示例:表中id=5、10,
WHERE id BETWEEN 5 AND 10
,會鎖定(5,10)之間的間隙,阻止插入id=6、7等記錄。
4.臨建鎖:
- 作用:記錄鎖+間隙鎖的組合,鎖定索引記錄以及前面的間隙(左開右閉),是InnoDB RR級別下默認的行鎖方式。
- 示例:表中id=5、10,
WHERE id=10
會鎖定 (5,10] 區間。