MySQL中的意向鎖 + next-key鎖 + 間隙鎖

引言

在數據庫并發控制中,鎖機制是保障數據一致性和隔離性的核心手段。MySQL中意向鎖、間隙鎖以及next-key鎖等復雜鎖類型,旨在協調表級鎖與行級鎖之間的關系,防止數據的臟讀、不可重復讀和幻讀現象,尤其是在可重復讀隔離級別下發揮關鍵作用。然而,鎖機制在提升數據隔離性的同時,也可能帶來死鎖風險和寫傾斜問題,影響系統的并發性能和業務邏輯正確性。本文將系統梳理MySQL中意向鎖與next-key鎖的原理及應用,剖析間隙鎖導致的死鎖現象,并結合實際案例探討寫傾斜問題及其解決方案,幫助讀者深入理解數據庫鎖機制與事務隔離的內在聯系。

意向鎖

主要作用是協調表鎖與行鎖之間的互斥關系。意向鎖本身之間是不會發生沖突的,與行級別的共享鎖(S 鎖)和排他鎖(X 鎖)也不發生沖突。它們主要與表級別的共享鎖(S 鎖)和排他鎖(X 鎖)發生沖突,在表級別加鎖時提升效率,避免全表掃描來判斷是否有行鎖存在。

  • 意向共享鎖(IS, Intention Shared Lock):當事務打算對表中的某些行加共享鎖(S 鎖)時,必須首先對該表加一個意向共享鎖(IS 鎖),告訴其他想鎖表的事務該表有行數據加了共享鎖。
  • 意向排他鎖(IX, Intention Exclusive Lock):當事務打算對表中的某些行加排他鎖(X 鎖)時,必須首先對該表加一個意向排他鎖(IX 鎖),告訴其他想鎖表的事務該表有行數據加了排他鎖。

next-key Lock的理解

next-key Lock = gap Lock + row Lock,只在可重復讀隔離級別存在。

  • 對主鍵或唯一索引,如果當前讀時,where條件全部精確命中(=或者in),這種場景本身就不會出現幻讀,只會加行記錄鎖。如果查詢未精準命中,查詢了不存在的值,會產生間隙鎖。例如:[1, 5, 10]。select * from table where id=3; 會對(1, 5)(左開右開)加上鎖。
  • 沒有索引的列,當前讀操作時,會加全表gap鎖,生產環境要注意。
  • 非唯一索引列,如果where條件部分命中(>、<、like等)或者全未命中,則會加附近gap間隙鎖。例如,某表數據如下,非唯一索引[2、6、9、9、11、15]。要操作非唯一索引列 9 的數據(select * from table where x = 9 for update),gap鎖將會鎖定的列是(6, 11](左開右閉),該區間內無法插入數據。
  • 主鍵或唯一索引,范圍查詢時會對查找范圍內的間隙上鎖,例如,唯一索引[1、5、10、15]。where id>1 and id<10 for update,gap鎖會對(1,10)(左開右開),該區間會加鎖。

next-key Lock無法解決的幻讀

next-key Lock可以解決當前讀下的幻讀問題,但引入了死鎖問題。next-key Lock無法解決當前讀隔離級別下的幻讀問題。

間隙鎖導致的死鎖問題

間隙鎖之間不互斥,間隙鎖和寫鎖之間是互斥的。

寫傾斜問題

當兩個或多個并發事務讀取相同的數據并基于這些讀取的結果執行寫操作時,因為這些事務在執行過程中彼此不可見,最終可能導致違反數據一致性或業務邏輯的結果。

舉個例子

假設,醫院調度系統,每個醫生在一天內只能處理最多 10 個病人。

  • 事務 A 和事務 B 都讀取到醫生1的病人數量是 9。
  • 事務 A 判斷病人數量小于 10,因此增加一個病人,病人數量變為 10,并提交事務。
  • 事務 B 仍然認為病人數量是 9(因為它讀取時事務 A 尚未提交),也增加一個病人,病人數量變為 11,并提交事務。
#表結構
CREATE TABLE doctor_patients (doctor_id INT,patient_count INT,PRIMARY KEY (doctor_id)
);#事務A
START TRANSACTION;
SELECT patient_count FROM doctor_patients WHERE doctor_id = 1;  -- 讀取到的病人數量是 9
-- 邏輯判斷:如果病人數量小于10,則增加一個病人
UPDATE doctor_patients SET patient_count = patient_count + 1 WHERE doctor_id = 1;
COMMIT;#事務B
START TRANSACTION;
SELECT patient_count FROM doctor_patients WHERE doctor_id = 1;  -- 讀取到的病人數量也是 9(因為事務 A 尚未提交)
-- 邏輯判斷:如果病人數量小于10,則增加一個病人
UPDATE doctor_patients SET patient_count = patient_count + 1 WHERE doctor_id = 1;
COMMIT;

解決辦法

  • 開啟串行化隔離級別,事務A對行數據加共享鎖,事務B也可以對行數據加共享鎖。事務A修改行數據時發現事務B加了共享鎖只能阻塞,事務B修改行數據時發現事務A加了共享鎖此時產生了死鎖。保證了不會產生鎖傾斜問題。
  • 讀數據時加上for update,保證其他事務無法讀取這行數據。

感謝您的閱讀!如果文章中有任何問題或不足之處,歡迎及時指出,您的反饋將幫助我不斷改進與完善。期待與您共同探討技術,共同進步!

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

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

相關文章

機器學習 數據集

數據集 1. scikit-learn工具介紹1.1 scikit-learn安裝1.2 Scikit-learn包含的內容 2 數據集2.1 sklearn玩具數據集介紹2.2 sklearn現實世界數據集介紹2.3 sklearn加載玩具數據集示例1&#xff1a;鳶尾花數據示例2&#xff1a;分析糖尿病數據集 2.4 sklearn獲取現實世界數據集示…

Linux-c語言串口程序

c語言串口程序 // C library headers #include <stdio.h> #include <string.h>// Linux headers #include <fcntl.h> // Contains file controls like O_RDWR #include <errno.h> // Error integer and strerror() function #include <termios.h&g…

TCP IP

TCP/IP 通信協議&#xff0c;不是單一協議&#xff0c;是一組協議的集合 TCP IP UDP 1.建立鏈接 三次握手 第一步&#xff1a;客戶端發送一個FIN報文&#xff0c;SEQX,等待服務器回應 第二步&#xff1a;服務器端受到&#xff0c;發送ackx1,seqy, 等待客戶端回應 第三步&am…

用uniapp在微信小程序實現畫板(電子簽名)功能,使用canvas實現功能

效果&#xff1a; 功能&#xff1a;實現重簽 退出 保存 等功能 解決的問題: 電子簽名畫布抖動問題解 注意&#xff1a; 保存的時候上傳到自己的服務器地址&#xff0c;后端返回圖片地址 代碼&#xff1a; <template><view><view class"signature&qu…

機器學習經典算法:用決策樹原理優化新能源汽車續航能力

?? “用決策樹重構新能源車能量大腦!算法推導+代碼實戰全解,續航暴增15%” 決策樹算法就像我們生活中做決策的 “流程指南”,通過層層判斷得出最終結論。比如你去超市買水果,站在琳瑯滿目的貨架前,就不自覺地用上了決策樹思維。首先,你可能會想 “今天想吃酸的還是甜的…

【Unity中的數學】—— 四元數

一、四元數的定義&#x1f60e; 四元數是一種高階復數&#xff0c;是一個四維空間的概念&#xff0c;相對于復數的二維空間。它可以表示為 q s i x j y k z q s ix jy kz qsixjykz&#xff0c;其中 s s s、 x x x、 y y y、 z z z 都是實數&#xff0c;并且滿足 i …

macOS 15.4.1 Chrome不能訪問本地網絡

前言 最近使用macmini m4&#xff0c;自帶macOS15系統&#xff0c;對于開發者簡直是一言難盡&#xff0c;Chrome瀏覽器的本地網絡有bug&#xff0c;可以訪問本機&#xff0c;但是不能訪問路由器上的其他機器&#xff0c;路由器提供的頁面也不能訪問&#xff0c;如下是折騰解決…

瀏覽器刷新結束頁面事件,調結束事件的接口(vue)

瀏覽器刷新的時候&#xff0c;正在進行中的事件結束掉&#xff0c;在刷新瀏覽器的時候做一些操作。 如果是調接口&#xff0c;就不能使用axios封裝的接口&#xff0c;需要使用原生的fetch。 找到公共的文件App.vue 使用window.addEventListener(‘beforeunload’, function (e…

TCP/IP 模型每層的封裝格式

TCP/IP 模型是一個四層網絡架構&#xff0c;每一層在數據傳輸時都會對數據進行封裝&#xff0c;添加相應的頭部&#xff08;和尾部&#xff09;信息。以下是各層的封裝格式及關鍵字段說明&#xff1a; 1. 應用層&#xff08;Application Layer&#xff09; 封裝格式&#xff1a…

【行業深度解析】什么是馬甲包?

在 Android 應用分發和增長運營的實踐中&#xff0c;“馬甲包” 是一個常被提及的策略術語。特別是在 Google Play 平臺上&#xff0c;許多開發者或運營團隊出于營銷、風險分攤或生態布局等原因&#xff0c;會選擇通過發布“馬甲包”來實現多元化的業務拓展。 然而&#xff0c…

谷歌與微軟的AI戰爭:搜索、云服務與生態布局

谷歌與微軟的AI戰爭&#xff1a;搜索、云服務與生態布局 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 谷歌與微軟的AI戰爭&#xff1a;搜索、云服務與生態布局摘要引言技術路線對比1. AI基礎設施&#xff1a;算力…

uniapp自定義導航欄搭配插槽

<uni-nav-bar dark :fixed"true" shadow background-color"#007AFF" left-icon"left" left-text"返回" clickLeft"back"><view class"nav-bar-title">{{ navBarTitle }}</view><block v-slo…

無人機飛控算法開發實戰:從零到一構建企業級飛控系統

簡介 無人機飛控算法是實現穩定飛行和精確控制的核心技術,涉及飛行動力學建模、傳感器數據處理、狀態估計和控制策略等多個環節。本實戰指南將系統講解四旋翼無人機飛控算法的開發流程,包括飛行動力學模型建立、傳感器校準與數據融合、主流控制算法實現(PID、ADRC、EKF)以…

p2p虛擬服務器

ZeroTier Central ? 推薦工具&#xff1a;ZeroTier&#xff08;免費、穩定、跨平臺&#xff09; ZeroTier 可以幫你把多臺設備&#xff08;無論是否跨網&#xff09;加入一個虛擬局域網&#xff0c;彼此間可以像在同一個 LAN 中通信&#xff0c;UDP 視頻、文件傳輸、SSH 等都…

MySQL數據庫遷移SQL語句指南

MySQL數據庫遷移SQL語句指南 一、基礎遷移方法 1. 使用mysqldump進行全量遷移 -- 導出源數據庫&#xff08;在命令行執行&#xff09; mysqldump -u [源用戶名] -p[源密碼] --single-transaction --routines --triggers --events --master-data2 [數據庫名] > migration…

畫立方體軟件開發筆記 js three 投影 參數建模 旋轉相機 @tarikjabiri/dxf導出dxf

gitee&#xff1a; njsgcs/njsgcs_3d mainwindow.js:4 Uncaught SyntaxError: The requested module /3dviewport.js does not provide an export named default一定要default嗎 2025-05-10 14-27-58 專門寫了個代碼畫立方體 import{ scene,camera,renderer} from ./3dviewp…

【工具】HandBrake使用指南:功能詳解與視頻轉碼

HandBrake使用指南&#xff1a;功能詳解與視頻轉碼 一、前言 高清視頻在當下日益普及&#xff0c;從影視制作到個人拍攝&#xff0c;從社交媒體發布到遠程教育&#xff0c;如何高效地壓縮、轉換和管理視頻文件的體積與清晰度&#xff0c;成為內容創作者與技術開發者的核心任務…

Docker容器網絡架構深度解析與技術實踐指南——基于Linux內核特性的企業級容器網絡實現

第1章 容器網絡基礎架構 1 Linux網絡命名空間實現原理 1.1內核級隔離機制深度解析 1.1.1進程隔離的底層實現 通過clone()系統調用創建新進程時&#xff0c;設置CLONE_NEWNET標志位將觸發內核執行以下操作&#xff1a; 內核源碼示例&#xff08;linux-6.8.0/kernel/fork.c&a…

SAP 交貨單行項目含稅金額計算報cx_sy_zerodivide處理

業務背景&#xff1a;SAP交貨單只有數量&#xff0c;沒有金額&#xff0c;所以開發報表從訂單的價格按數量計算交貨單的金額。 用戶反饋近期報表出現異常&#xff1a; ****2012/12/12 清風雅雨 規格變更 Chg 修改開始 ** 修改原因:由于余數為0時&#xff0c;可能會報錯溢出。…

【高數上冊筆記01】:從集合映射到區間函數

【參考資料】 同濟大學《高等數學》教材樊順厚老師B站《高等數學精講》系列課程 &#xff08;注&#xff1a;本筆記為個人數學復習資料&#xff0c;旨在通過系統化整理替代厚重教材&#xff0c;便于隨時查閱與鞏固知識要點&#xff09; 僅用于個人數學復習&#xff0c;因為課…