MySQL鎖可以按照多個維度進行分類,下面我用最清晰的方式為你梳理所有分類方式:
一、按鎖的粒度分類(最常用分類)
鎖類型 | 作用范圍 | 特點 | 適用引擎 | 示例場景 |
---|
表級鎖 | 整張表 | 開銷小、加鎖快,并發度低 | MyISAM, MEMORY | 數據遷移、全表統計分析 |
行級鎖 | 表中的單行 | 開銷大、加鎖慢,并發度高 | InnoDB, NDB | 訂單處理、庫存扣減 |
頁級鎖 | 數據頁(16KB) | 介于表鎖和行鎖之間 | BDB(已淘汰) | 基本不再使用 |
二、按鎖的模式分類
鎖模式 | 簡稱 | 兼容性 | 示例SQL |
---|
共享鎖 | S鎖 | 允許其他事務讀,阻止寫 | SELECT ... LOCK IN SHARE MODE |
排他鎖 | X鎖 | 阻止其他事務讀和寫 | SELECT ... FOR UPDATE |
意向共享鎖 | IS鎖 | 表示事務準備加行級S鎖 | 自動添加(檢查表級兼容性) |
意向排他鎖 | IX鎖 | 表示事務準備加行級X鎖 | 自動添加(檢查表級兼容性) |
三、按鎖的實現方式分類
類型 | 原理 | 優點 | 缺點 | 實現方式 |
---|
悲觀鎖 | 先加鎖再操作 | 強一致性 | 性能開銷大 | SELECT ... FOR UPDATE |
樂觀鎖 | 先操作,沖突時處理 | 高性能 | 需處理沖突 | 版本號/CAS機制 |
四、InnoDB特有的行鎖算法
鎖類型 | 鎖定范圍 | 解決的問題 | 觸發條件 |
---|
記錄鎖 | 單個索引記錄 | 精確匹配的更新 | WHERE id=1 FOR UPDATE |
間隙鎖 | 索引記錄之間的間隙 | 防止幻讀 | 范圍查詢WHERE id>5 AND id<10 |
臨鍵鎖 | 記錄+間隙(左開右閉) | 防止幻讀 | RR隔離級別下的索引范圍掃描 |
插入意向鎖 | 特定插入位置的間隙 | 提高插入并發 | INSERT操作前自動獲取 |
五、按鎖的持有時間分類
類型 | 持有時間 | 示例 |
---|
短期鎖 | 語句/事務執行期間 | 普通的SELECT FOR UPDATE |
長期鎖 | 跨事務保持 | FLUSH TABLES WITH READ LOCK |
六、按鎖的自動性分類
類型 | 獲取方式 | 示例 |
---|
顯式鎖 | 手動獲取 | SELECT ... FOR UPDATE |
隱式鎖 | 自動獲取 | INSERT/UPDATE/DELETE語句 |
最后,開發中:
能用行鎖不用表鎖,能用樂觀鎖不用悲觀鎖,鎖的粒度越小越好!