MySQL中的鎖機制復雜多樣,主要可根據鎖粒度、互斥性、加鎖方式及思想維度等多個維度進行分類。以下是主要鎖類型的詳細概述:
一、按鎖粒度分類
1、全局鎖
定義:對整個數據庫實例加鎖,使數據庫處于只讀狀態。
用途:用于全庫邏輯備份,確保備份期間數據一致性。
命令:FLUSH TABLES WITH READ LOCK施加鎖,UNLOCK TABLES釋放鎖。
2、表級鎖
表鎖:鎖定整張表,分為讀鎖(允許讀但禁止寫)和寫鎖(僅當前線程可讀寫),MyISAM存儲引擎默認使用此鎖。
元數據鎖(MDL):保護表結構,自動加鎖機制防止DDL與DML操作沖突。
意向鎖:包括意向共享鎖(IS)和意向排他鎖(IX),用于協調行鎖與表鎖的共存,表明事務將對表中某行加鎖。
3、頁級鎖
定義:鎖定數據頁,開銷和加鎖時間介于表鎖和行鎖之間,現實業務中使用較少。
4、行級鎖
記錄鎖:直接鎖定索引記錄本身,防止其他事務對該行進行更新或刪除操作。
間隙鎖:鎖定索引記錄之間的間隙,防止其他事務在間隙中插入新記錄,避免幻讀。
臨鍵鎖:結合記錄鎖和間隙鎖的特性,同時鎖住數據及其前后間隙,在RR隔離級別下默認啟用。
二、按互斥性分類
1、共享鎖(S鎖)
定義:允許事務讀取資源,但阻止其他事務獲取排他鎖。
語法:通過SELECT ... LOCK IN SHARE MODE或SELECT ... FOR SHARE顯式添加。
2、排他鎖(X鎖)
定義:允許事務更新或刪除資源,并阻止其他事務獲取任何類型的鎖。
語法:通過SELECT ... FOR UPDATE顯式添加。
三、按加鎖方式分類
1、顯示鎖
定義:通過手動編寫SQL語句指定的鎖。
示例:SELECT ... FOR UPDATE或LOCK TABLES ... READ/WRITE。
2、隱式鎖
定義:由系統根據事務隔離級別自動施加的鎖。
特點:無需用戶顯式指定,由數據庫管理系統自動管理。
四、按思想維度分類
1、樂觀鎖
定義:假設并發沖突概率較低,僅在提交時檢查數據是否被修改,適用于讀多寫少的場景。
實現:通常通過版本號或時間戳判斷數據變更。
2、悲觀鎖
定義:假設并發沖突頻繁,提前加鎖避免競爭,適用于寫多讀少的場景。
實現:通過SELECT ... FOR UPDATE等語句顯式加鎖。
五、其他重要鎖類型
1、插入意向鎖
定義:INSERT操作前設置的特殊間隙鎖,允許多個事務在同一間隙插入不同位置的數據。
作用:提升插入操作的并發性能。
2、自增鎖(AUTO-INC Lock)
定義:針對自增列的特殊鎖,確保自增值的唯一性和順序性。
3、空間謂詞鎖
定義:用于空間索引的特殊鎖,優化地理空間數據的查詢效率。
綜上所述,MySQL提供了多種鎖類型以滿足不同場景的需求,每種鎖都有其特定的用途和特點。在選擇使用哪種鎖時,應根據具體的應用場景和需求來決定。