MySQL里的鎖有哪些

MySQL 的鎖機制是實現并發控制的核心,不同層級的鎖適用于不同場景,以下是對其鎖類型的系統分類及詳細說明:

一、按鎖粒度劃分

1. 全局鎖(Global Lock)
  • 用途:鎖定整個數據庫實例,用于全庫備份。

  • 命令:

    FLUSH TABLES WITH READ LOCK;  -- 加全局讀鎖
    UNLOCK TABLES;                -- 釋放鎖
    
  • 影響:阻塞所有寫操作及DDL操作,僅允許讀操作。

2. 表級鎖(Table-Level Lock)
  • 表鎖(Table Lock)

    • MyISAM引擎使用,分為:

      • 表共享讀鎖(S鎖):允許其他會話讀,阻塞寫。
      • 表獨占寫鎖(X鎖):阻塞其他會話的讀寫。
    • 命令:

      LOCK TABLES table_name READ;  -- 加讀鎖
      LOCK TABLES table_name WRITE; -- 加寫鎖
      UNLOCK TABLES;               -- 釋放鎖
      
  • 元數據鎖(Metadata Lock, MDL)

    • 自動加鎖:訪問表時自動加MDL讀鎖,修改結構時加MDL寫鎖。
    • 問題:長事務可能導致DDL阻塞(如ALTER TABLE等待)。
  • 意向鎖(Intention Locks)

    • 作用:快速判斷表內是否有行級鎖沖突,減少鎖檢查開銷。
    • 類型:
      • 意向共享鎖(IS):表明事務意圖對某些行加S鎖。
      • 意向排他鎖(IX):表明事務意圖對某些行加X鎖。
3. 行級鎖(Row-Level Lock)
  • InnoDB引擎支持,鎖定索引記錄,類型包括:
    • 記錄鎖(Record Lock):鎖定索引中的某一行。
    • 間隙鎖(Gap Lock):鎖定索引記錄之間的間隙,防止幻讀。
    • 臨鍵鎖(Next-Key Lock):記錄鎖 + 間隙鎖,鎖定左開右閉區間。
    • 插入意向鎖(Insert Intention Lock):插入前對間隙加鎖,允許不同插入位置的并發。
  • 自增鎖(AUTO-INC Lock)
    • 用途:確保自增列(AUTO_INCREMENT)值的唯一性。
    • 優化:MySQL 8.0引入輕量級鎖(互斥量),減少性能影響。

二、按鎖模式劃分

1. 共享鎖(Shared Lock, S鎖)
  • 行為:允許其他事務加S鎖,阻塞X鎖。

  • 使用場景:

    SELECT ... LOCK IN SHARE MODE;  -- 顯式加S鎖
    
2. 排他鎖(Exclusive Lock, X鎖)
  • 行為:阻塞其他事務的S鎖和X鎖。

  • 使用場景:

    SELECT ... FOR UPDATE;  -- 顯式加X鎖
    

三、按鎖策略劃分

1. 悲觀鎖(Pessimistic Locking)
  • 假設:認為并發沖突頻繁,提前加鎖。
  • 實現:通過SELECT ... FOR UPDATE顯式加鎖。
2. 樂觀鎖(Optimistic Locking)
  • 假設:認為沖突較少,通過版本號或時間戳控制。

  • 實現:

    UPDATE table SET column = new_value, version = version + 1 
    WHERE id = 1 AND version = old_version;
    

四、鎖的兼容性與沖突

已存在的鎖IS鎖(新請求)IX鎖(新請求)S鎖(新請求)X鎖(新請求)
IS鎖????
IX鎖????
S鎖????
X鎖????

五、不同隔離級別的鎖策略

隔離級別鎖機制
READ UNCOMMITTED不加鎖(通過快照讀),可能臟讀。
READ COMMITTED行級鎖(記錄鎖),無間隙鎖,允許幻讀。
REPEATABLE READ臨鍵鎖(Next-Key Lock)防止幻讀,默認隔離級別。
SERIALIZABLE所有讀操作隱式加共享鎖,完全串行化。

六、鎖的監控與診斷

1. 查看鎖信息
SHOW ENGINE INNODB STATUS;          -- 查看Inno引擎狀態(含鎖信息)
SELECT * FROM information_schema.INNODB_LOCKS;   -- 當前持有的鎖
SELECT * FROM information_schema.INNODB_LOCK_WAITS; -- 鎖等待關系
2. 常見問題
  • 死鎖:事務相互等待鎖釋放,InnoDB自動檢測并回滾代價較小的事務。
  • 鎖等待超時:由參數innodb_lock_wait_timeout控制(默認50秒)。

七、示例場景

場景1:防止超賣(臨鍵鎖)
-- 事務1:扣減庫存
BEGIN;
SELECT stock FROM products WHERE id = 1 FOR UPDATE; -- 加X鎖
UPDATE products SET stock = stock - 1 WHERE id = 1;
COMMIT;
  • 作用:臨鍵鎖防止其他事務插入新記錄,確保庫存準確。
場景2:批量插入(間隙鎖)
-- 事務1:查詢范圍數據
BEGIN;
SELECT * FROM orders WHERE amount > 100 FOR UPDATE; -- 對間隙加鎖
  • 作用:阻止其他事務在amount > 100范圍內插入新數據。

總結

MySQL通過多粒度鎖(全局鎖、表鎖、行鎖)和多種鎖模式(S/X鎖、意向鎖)實現高效的并發控制。合理選擇事務隔離級別和鎖策略(如臨鍵鎖防幻讀、樂觀鎖降級沖突)是優化性能的關鍵。監控工具和診斷命令可幫助快速定位鎖爭用問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/74407.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74407.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/74407.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring WebFlux 教程

Spring WebFlux 教程 Spring WebFlux 是 Spring Framework 5 引入的一種新的響應式編程框架,旨在處理高并發、高性能和實時數據流應用。與傳統基于線程阻塞的 Spring MVC 不同,WebFlux 采用了非阻塞、事件驅動的編程模型,能夠更加高效地利用…

SCI英文論文Accepted后的第一步——Rights and Access

SCI英文論文Accepted后的第一步——Rights and Access 目錄 SCI英文論文Accepted后的第一步——Rights and AccessBased on information provided the embargo period/end date is 24 months. 因為選擇閉源**Rights and Access(版權與訪問權限)**環節是關鍵第一步,具體操作流…

Qt文件管理系統

引言 今天我將使用model/view模型視圖框架來完成一個簡單的Qt文件管理系統,主要使用到了QTreeView、QTabelView視圖和QFileSystemModel文件系統模型。 界面設計 使用Qt創建項目并勾選創建ui文件,打開ui文件,使用Tree View、Table View、St…

《可愛風格 2048 游戲項目:HTML 實現全解析》

一、引言 在如今的數字化時代,小游戲以其簡單易上手、趣味性強的特點深受大家喜愛。2048 游戲作為一款經典的數字合并游戲,擁有龐大的玩家群體。本文將詳細介紹一個用單文件 HTML 實現的可愛風格 2048 游戲項目,它不僅具備傳統 2048 游戲的基…

CSS3:深度解析與實戰應用

CSS3:深度解析與實戰應用詳解 1. 選擇器增強2. 盒模型擴展3. 漸變和背景4. 轉換和動畫總結 CSS3 是 CSS(層疊樣式表)的最新版本,它引入了許多新的特性和功能,使得網頁的樣式設計更加靈活、豐富和具有動態效果。在本文中…

C語言 —— 此去經年夢浪蕩魂音 - 深入理解指針(卷四)

目錄 1. 回調函數 2. qsort函數 2.1 使用qsort函數排序整型數據 2.2 使用qsort排序結構數據 2.3 使用冒泡排序模擬實現qsort函數 1. 回調函數 回調函數其實就是一個通過函數指針調用的函數,如果你把函數的指針作為參數傳遞給另一個函數,當這個指針被…

Shiro框架漏洞攻略

漏洞原理:服務端在接收到?個Cookie時,會按照如下步驟進?解析處理:1.檢索RememberMe Cookie的值 2.進?Base64解碼 3.進?AES解碼 4.進?反序列化操作 在第4步中的調?反序列化時未進?任何過濾,進?可以導致出發遠程代碼執?漏…

Ceph集群2025(Squid版)導出高可用NFS集群(下集 )

本次主要對接K8S和傳統的一樣而已,比較簡單,不再過多講解 官網 https://github.com/kubernetes-csi/csi-driver-nfs/tree/master/chartshelm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts helm pull c…

洛谷題單入門4-P5729 【深基5.例7】工藝品制作-python

輸入格式 第一行三個正整數 w,x,h。 第二行一個正整數 q。 接下來 q 行,每行六個整數 輸出格式 輸出一個整數表示答案。 三維數組直接標記 class Solution:staticmethoddef oi_input():"""從標準輸入讀取數據"""w, x, h map(…

亞馬遜云科技全面托管DeepSeek-R1模型現已上線

文章目錄 亞馬遜云科技全面托管DeepSeek-R1模型現已上線在Amazon Bedrock中開始使用DeepSeek-R1模型DeepSeek-R1現已可用 亞馬遜云科技全面托管DeepSeek-R1模型現已上線 亞馬遜云科技提供眾多免費云產品,可以訪問:亞馬遜云科技 截至1月30日,D…

IO模型種類

文章目錄 同步阻塞 I/O(Blocking I/O,BIO)同步非阻塞 I/O(Non-blocking I/O,NIO)I/O 多路復用(I/O Multiplexing)信號驅動 I/O(Signal-driven I/O)異步 I/O&a…

C語言入門教程100講(40)文件定位

文章目錄 1. 什么是文件定位?2. 文件指針3. 文件定位函數3.1 `fseek` 函數3.2 `ftell` 函數3.3 `rewind` 函數4. 示例代碼代碼解析:輸出結果:5. 常見問題問題 1:`fseek` 的 `offset` 參數可以為負數嗎?問題 2:如何判斷文件定位是否成功?問題 3:`rewind` 和 `fseek(file…

el-table折疊懶加載支持排序

el-table折疊懶加載支持排序 因為el-table懶加載的子節點是通過緩存實現的,如果想在展開的情況下直接刷新對應子節點數據,要操作el-table組件自身數據,否則不會更新 以排序功能為例 maps: new Map() //用于存儲子節點懶加載的數據// 加載子…

Off-Road-Freespace-Detection配置pytorch2.0.0

一、概述 在github上進行開源代碼搜索,發現了Off-Road-Freespace-Detection(鏈接如下所示)。這是對越野環境可通行區域的檢測,在經過測試之后,發現對自己有益。 GitHub - chaytonmin/Off-Road-Freespace-Detection: O…

ChatGPT降低論文AIGC重復率的提示詞合集(高效降重方法)

💡 問題:寫完畢業論文后,查AIGC率過高,手動降重后仍然很高,該怎么辦? 📌 解決方案: 1?? 先查AIGC率(找出AI生成的部分) 2?? 用ChatGPT優化(使…

【Spring 新特性全解析】

Spring 新特性全解析 引言 在當今 Java 企業級開發領域,Spring 框架無疑是中流砥柱般的存在。它以其強大的功能、高度的可擴展性和便捷的開發體驗,贏得了廣大開發者的青睞。隨著技術的不斷演進,Spring 也在持續更新迭代,帶來了一…

System.arraycopy 在音視頻處理中的應用

在音視頻開發領域,我們經常需要處理大量的數據,例如音頻 PCM 數據的傳輸、視頻幀的緩存等。在這些場景下,數據的復制與傳輸往往直接影響到應用的性能。Java 提供的 System.arraycopy 方法,在音視頻處理代碼中出現頻率非常高。本文…

fastapi+angular評論和回復

說明:fastapiangular評論和回復 效果圖: step1:sql show databases; DROP TABLE users; SHOW CREATE TABLE db_school.users; show tables; use db_school; SELECT * FROM db_school.jewelry_categories; CREATE DATABASE db_school; select *from users -- 用戶…

C++11QT復習 (三)

文章目錄 [toc]Day5-2 文件IO(2025.03.24)1. 緩沖區與刷新1.1 常見的緩沖刷新方式 2. 文件讀寫操作2.1 讀取文件2.2 寫入文件2.3 追加模式寫入2.3 完整代碼 3. 文件定位操作4. 字符串IO5. 配置文件解析示例6. 完整代碼7. 二進制文件操作總結 Day5-2 文件…

Redis Sentinel 詳解

Redis Sentinel 詳解 1. 什么是 Redis Sentinel?有什么用? Redis Sentinel(哨兵) 是 Redis 官方提供的高可用性解決方案,主要用于監控、通知和自動故障轉移。當 Redis 主節點(master)發生故障…