MySQL中的鎖機制是確保數據庫并發操作正確性和一致性的重要組成部分,根據鎖的粒度、用途和特性,可以分為多種類型。以下是MySQL中常見的鎖及其詳細說明:
一、按鎖的粒度劃分
-
行級鎖(Row-level Locks)
- 描述:鎖定表中的單行記錄,允許多個事務同時訪問表的不同行,提供高并發性。
- 支持引擎:InnoDB(默認支持)。
- 類型:
- 記錄鎖(Record Lock):直接鎖定某一行,防止其他事務修改或刪除。
- 間隙鎖(Gap Lock):鎖定索引記錄之間的間隙,防止新記錄插入(用于防止幻讀)。
- 臨鍵鎖(Next-Key Lock):結合記錄鎖和間隙鎖,鎖定一個范圍及其行(默認行鎖實現方式)。
-
表級鎖(Table-level Locks)
- 描述:鎖定整個表,事務訪問表時需先獲取鎖,并發性較低。
- 支持引擎:MyISAM、InnoDB(通過意向鎖間接實現)。
- 類型:
- 表共享讀鎖(S Lock):允許其他事務讀表,但禁止寫。
- 表獨占寫鎖(X Lock):禁止其他事務讀寫。
-
頁級鎖(Page-level Locks)
- 描述:鎖定數據頁(一組連續的行),介于行鎖和表鎖之間。
- 支持引擎:BDB(已棄用),InnoDB不直接使用。
二、按鎖的性質劃分
-
共享鎖(Shared Lock, S Lock)
- 行為:允許其他事務讀同一數據,但禁止寫。
- 使用場景:
SELECT ... LOCK IN SHARE MODE
。
-
排他鎖(Exclusive Lock, X Lock)
- 行為:禁止其他事務讀寫數據。
- 使用場景:
SELECT ... FOR UPDATE
,數據修改(INSERT/UPDATE/DELETE)。
-
意向鎖(Intention Locks)
- 作用:協調不同粒度鎖(如表鎖與行鎖)的沖突檢測。
- 類型:
- 意向共享鎖(IS):事務打算在表的某些行上加共享鎖。
- 意向排他鎖(IX):事務打算在表的某些行上加排他鎖。
三、特殊用途鎖
-
自增鎖(Auto-inc Lock)
- 作用:確保自增主鍵(AUTO_INCREMENT)的連續性和唯一性。
- 特點:在插入操作時短暫持有,事務提交后釋放。
-
元數據鎖(Metadata Lock, MDL)
- 作用:保護表結構(如ALTER TABLE)不被并發修改。
- 行為:自動加鎖,事務結束時釋放。
-
全局鎖(Global Lock)
- 作用:鎖定整個數據庫實例,禁止所有寫操作。
- 使用場景:全庫備份(
FLUSH TABLES WITH READ LOCK
)。
四、鎖的兼容性
請求鎖 \ 現有鎖 | X | IX | S | IS |
---|---|---|---|---|
X(排他鎖) | 沖突 | 沖突 | 沖突 | 沖突 |
IX(意向排他鎖) | 沖突 | 兼容 | 沖突 | 兼容 |
S(共享鎖) | 沖突 | 沖突 | 兼容 | 兼容 |
IS(意向共享鎖) | 沖突 | 兼容 | 兼容 | 兼容 |
五、鎖與隔離級別
- 讀未提交(Read Uncommitted):不加鎖,通過臟讀實現。
- 讀已提交(Read Committed):使用記錄鎖,無間隙鎖。
- 可重復讀(Repeatable Read):默認使用臨鍵鎖(Next-Key Lock),防止幻讀。
- 串行化(Serializable):所有讀操作加共享鎖,寫操作加排他鎖。
六、死鎖處理
- 檢測機制:InnoDB通過等待圖(Wait-for Graph)檢測死鎖。
- 處理策略:強制回滾代價較小的事務,釋放其鎖資源。
七、監控與分析工具
SHOW ENGINE INNODB STATUS
:查看InnoDB引擎狀態,包括鎖信息。INFORMATION_SCHEMA
:INNODB_TRX
:當前運行的事務。INNODB_LOCKS
:當前持有的鎖。INNODB_LOCK_WAITS
:鎖等待關系。
- 性能模式(Performance Schema):監控鎖的獲取和釋放。
你想要的我全都有:https://pan.q刪掉憨子uark.cn/s/75a5a07b45a2