MySQL中的鎖類型都有哪些
MySQL 中的鎖機制是保障事務(wù)隔離性和并發(fā)控制的核心組件,主要分為以下類型,按作用范圍和場景分類如下:
一、按鎖粒度分類
1. 表級鎖(Table-Level Locking)
特性:鎖定整張表,開銷小但并發(fā)性低。
常見類型:
- 表共享鎖(LOCK TABLES … READ):允許其他事務(wù)讀表,但禁止寫操作。
- 表排他鎖(LOCK TABLES … WRITE):禁止其他事務(wù)讀寫表。
意向鎖(Intention Locks):
- 意向共享鎖(IS):事務(wù)打算在行上加共享鎖。
- 意向排他鎖(IX):事務(wù)打算在行上加排他鎖。
- 作用:作為表級鎖,與行級鎖兼容性判斷的標識,優(yōu)化鎖沖突檢測。
2. 行級鎖(Row-Level Locking)
特性:僅鎖定數(shù)據(jù)行,開銷大但并發(fā)性高(InnoDB 默認支持)。
常見類型:
- 記錄鎖(Record Locks):鎖定索引中的單條記錄。
- 間隙鎖(Gap Locks):鎖定索引記錄之間的“間隙”,防止插入新數(shù)據(jù)(解決幻讀)。
- 臨鍵鎖(Next-Key Locks):記錄鎖 + 間隙鎖的組合,鎖定記錄本身及前一個間隙(InnoDB 默認鎖模式)。
二、按鎖模式分類
1. 共享鎖(Shared Lock,S鎖)
- 特性:允許其他事務(wù)讀取數(shù)據(jù),但禁止修改。
- 使用場景:
SELECT ... LOCK IN SHARE MODE。
2. 排他鎖(Exclusive Lock,X鎖)
- 特性:禁止其他事務(wù)讀寫數(shù)據(jù)。
- 使用場景:
SELECT ... FOR UPDATE或自動由INSERT/UPDATE/DELETE觸發(fā)。
三、特殊場景鎖
1. 自增鎖(AUTO-INC Locks)
- 特性:針對
AUTO_INCREMENT列,確保自增值唯一且連續(xù)。 - 行為:在插入語句執(zhí)行時短暫持有,可能成為并發(fā)瓶頸。
2. 插入意向鎖(Insert Intention Locks)
- 特性:當事務(wù)嘗試插入數(shù)據(jù)到已鎖定的間隙時,設(shè)置插入意向鎖,表示等待間隙釋放。
- 作用:避免插入沖突,提高并發(fā)插入效率。
3. 元數(shù)據(jù)鎖(Metadata Locks,MDL)
特性:隱式加鎖,管理對表結(jié)構(gòu)的并發(fā)訪問(如 DDL 操作)。
行為:
- 修改表結(jié)構(gòu)時(
ALTER TABLE),自動請求元數(shù)據(jù)排他鎖。 - 其他事務(wù)若持有該表的元數(shù)據(jù)鎖,需等待釋放。
四、存儲引擎差異
- InnoDB:支持行級鎖、間隙鎖、臨鍵鎖,默認隔離級別為
REPEATABLE READ。 - MyISAM:僅支持表級鎖,無行級鎖,并發(fā)性能較低。
五、鎖行為與隔離級別關(guān)系
| 隔離級別 | 鎖類型 | 特點 |
|---|---|---|
| 讀未提交 | 無間隙鎖,僅記錄鎖 | 允許臟讀,鎖競爭最少 |
| 讀已提交 | 記錄鎖(MVCC) | 通過快照讀避免臟讀,但可能幻讀 |
| 可重復(fù)讀(默認) | 臨鍵鎖(Next-Key Locks) | 默認鎖模式,防止幻讀,但可能增加鎖競爭 |
| 串行化 | 強制表級鎖或間隙鎖 | 完全串行執(zhí)行,性能最低 |
六、使用建議
- 優(yōu)化索引:合理設(shè)計索引可減少鎖范圍(如唯一索引避免間隙鎖)。
- 控制事務(wù)粒度:避免長時間持有鎖,減少鎖競爭。
- 監(jiān)控鎖狀態(tài):通過
SHOW ENGINE INNODB STATUS或INFORMATION_SCHEMA.INNODB_LOCKS分析鎖沖突。 - 隔離級別選擇:根據(jù)業(yè)務(wù)需求權(quán)衡一致性與并發(fā)性能(如讀已提交 + 索引優(yōu)化)。
通過理解鎖類型和行為,可有效優(yōu)化 MySQL 并發(fā)性能,避免死鎖和性能瓶頸。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
mysql存儲過程之創(chuàng)建(CREATE PROCEDURE)和調(diào)用(CALL)及變量創(chuàng)建(DECLARE)和賦值(SET
這篇文章主要介紹了mysql存儲過程之創(chuàng)建(CREATE PROCEDURE)和調(diào)用(CALL)及變量創(chuàng)建(DECLARE)和賦值(SET)操作方法,結(jié)合實例形式較為詳細的分析了mysql存儲過程創(chuàng)建、調(diào)用及變量創(chuàng)建、賦值具體原理、操作技巧與相關(guān)注意事項,需要的朋友可以參考下2019-12-12
MYSQL數(shù)據(jù)庫使用UTF-8中文編碼亂碼的解決辦法
這篇文章主要介紹了MYSQL數(shù)據(jù)庫使用UTF-8中文編碼亂碼的解決辦法,需要的朋友可以參考下2015-10-10
MySql分頁時使用limit+order by會出現(xiàn)數(shù)據(jù)重復(fù)問題解決
在MySQL中我們通常會采用limit來進行翻頁查詢,當limit遇到 order by的時候會出現(xiàn)數(shù)據(jù)重復(fù)問題,本文就來記錄一下,感興趣的可以了解一下2021-08-08
Windows下mysql?8.0.29?winx64安裝配置方法圖文教程
這篇文章主要為大家詳細介紹了Windows下mysql?8.0.29?winx64安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07

