數據庫事務隔離級別與 MVCC 機制詳解

最近在準備面試,正把平時積累的筆記、項目中遇到的問題與解決方案、對核心原理的理解,以及高頻業務場景的應對策略系統梳理一遍,既能加深記憶,也能讓知識體系更扎實,供大家參考,歡迎討論。

在數據庫并發操作場景中,事務隔離級別是保障數據一致性的核心機制,不同隔離級別對應不同的并發控制策略,而 MVCC(多版本并發控制)則是實現部分隔離級別的關鍵技術

一、數據庫事務隔離級別概述

事務隔離級別定義了多個并發事務之間的相互影響程度,從低到高分為四個級別,不同級別在數據一致性和系統性能之間呈現不同的平衡關系。

1.1 讀未提交(Read Uncommitted)

? 定義:最低的隔離級別,允許當前事務讀取其他事務尚未提交的數據變更。

? 核心問題:無法避免臟讀、不可重復讀和幻讀。

? 臟讀:讀取到其他事務未提交的“臨時數據”,若后續事務回滾,當前讀取的數據將變為無效。

? 適用場景:對數據一致性要求極低,僅追求極致性能的場景(如臨時統計查詢,無需精確結果),實際業務中極少使用。業務場景基本都不用

1.2 讀已提交(Read Committed, RC)

? 定義:允許當前事務讀取其他事務已提交的數據變更,是許多數據庫的默認隔離級別之一(如 Oracle)。

? 核心能力:可阻止臟讀,但仍可能出現不可重復讀和幻讀。

? 不可重復讀:同一事務內,對同一字段多次讀取,結果因其他事務提交的更新操作而不同。? 幻讀:同一事務內,執行相同的查詢語句,結果因其他事務提交的插入/刪除操作而新增或減少數據行。

? 實現依賴:基于 MVCC 機制實現,通過讀取數據的“已提交版本”保障數據有效性。

1.3 可重復讀(Repeatable Read, RR)

? 定義:MySQL InnoDB 引擎的默認隔離級別,確保同一事務內,對同一字段的多次讀取結果一致(除非數據由當前事務自身修改)。

? 核心能力:可阻止臟讀和不可重復讀,但仍可能出現幻讀(需通過額外機制解決)。

? 幻讀解決方案:

? 升級隔離級別至串行化:所有事務順序執行,完全避免并發干擾,但會導致性能大幅下降,僅適用于數據一致性要求極高且并發量低的場景。? MVCC 解決快照讀幻讀:針對簡單 SELECT(快照讀),通過讀取數據的歷史版本(非最新版本),確保同一事務內查詢結果一致。MySQL使用的這個來解決幻讀,相對鎖解決幻讀而言,性能較高。? GapLock + Next-KeyLock 解決當前讀幻讀:針對 SELECT ... FOR UPDATE、SELECT ... LOCK IN SHARE MODE 等當前讀操作,通過間隙鎖(GapLock)和 next-key 鎖,鎖定查詢范圍,防止其他事務插入/刪除數據,避免幻讀。

1.4 串行化(Serializable)

? 定義:最高的隔離級別,強制所有事務按順序逐個執行,完全禁止并發操作。互聯網項目基本沒用這個的,項目上線有點并發就會非常卡頓了。

? 核心能力:完全符合 ACID 的隔離要求,可阻止臟讀、不可重復讀和幻讀,數據一致性最強。

? 缺點:極大限制并發性能,僅適用于數據安全性優先于性能的極端場景(如金融核心交易的關鍵步驟)。在這里插入圖片描述

二、MVCC(多版本并發控制)機制

MVCC 是一種高效的并發控制技術,主要用于實現 “讀已提交(RC)” 和 “可重復讀(RR)” 隔離級別,通過維護數據的多個版本,實現 “讀 - 寫”“寫 - 讀” 并發執行,在保障數據一致性的同時提升系統性能。

2.1 MVCC 的核心原理

MVCC 的核心是為每行數據維護多個歷史版本,事務讀取時根據自身版本號選擇可見的數據版本,避免直接加鎖導致的并發瓶頸。其關鍵機制包括:

  1. 事務版本號
    ? 系統會為每個新啟動的事務分配一個唯一的遞增版本號(transaction_id),事務開始時的版本號即為該事務的標識。

    ? 數據行的版本號與事務版本號關聯,確保事務只能讀取符合可見性規則的數據。

  2. 隱藏列與版本鏈
    ? InnoDB 引擎的聚簇索引記錄中,默認包含兩個隱藏列,用于構建數據的版本鏈:

     ? trx_id:存儲每次修改該數據行的事務 ID,記錄數據的“修改者”。? roll_pointer:存儲一個指針,指向該數據行的上一個歷史版本(存儲在 Undo 日志中),通過該指針可串聯所有歷史版本,形成“版本鏈”。
    

    ? 注意:插入操作的 Undo 日志無 roll_pointer,因為插入的數據無歷史版本。

  3. Undo 日志的作用
    ? Undo 日志用于保存數據的歷史版本,當事務需要讀取歷史數據時,通過 roll_pointer 從 Undo 日志中獲取對應版本。

    ? 事務提交后,Undo 日志不會立即刪除,而是根據垃圾回收機制(Purge)在合適時機清理,確保其他事務仍能訪問所需的歷史版本。

2.2 MVCC 的適用范圍與限制

? 適用隔離級別:僅支持 “讀已提交(RC)” 和 “可重復讀(RR)”,不支持 “讀未提交”(需讀取未提交數據,與 MVCC 的“版本可見性規則”沖突)和 “串行化”(強制順序執行,無需 MVCC)。

? 適用讀操作類型:

? 快照讀:簡單 SELECT 語句(無 FOR UPDATE、LOCK IN SHARE MODE),通過 MVCC 讀取歷史版本,無需加鎖,并發性能高。? 當前讀:DELETE、UPDATE、INSERT 及 SELECT ... FOR UPDATE 等操作,需讀取數據最新版本,并加鎖防止并發修改,不依賴 MVCC 的版本鏈,而是通過鎖機制保障一致性。

2.3 MVCC 與樂觀鎖的關聯

MySQL 的 MVCC 本質是樂觀鎖的一種實現方式:

? 每行數據的版本號(通過 trx_id 和版本鏈間接體現)作為樂觀鎖的“版本標識”。

? 事務更新數據時,會檢查當前數據的版本號是否與預期一致(類似 “WHERE version = V” 的邏輯),若一致則更新并生成新版本,若不一致則重試或失敗,避免并發沖突。

三、RC 與 RR 隔離級別的應用場景對比

RC 和 RR 均基于 MVCC 實現,但因版本可見性規則不同,適用場景存在顯著差異:

】![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/b4d312f414f54d87822a8308adc4d046.png

四、關鍵總結

? 事務隔離級別從低到高為:“讀未提交 → 讀已提交 → 可重復讀 → 串行化”,一致性越強,性能越弱,需根據業務場景權衡選擇。

? MVCC 是實現 RC 和 RR 的核心技術,通過版本鏈和 Undo 日志實現“無鎖讀”,提升并發性能。

? RR 的幻讀需通過“MVCC(快照讀)”或“GapLock + Next-KeyLock(當前讀)”解決,RC 因每次查詢讀最新版本,幻讀問題更明顯。

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

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

相關文章

【Cursor-Gpt-5-high】StackCube-v1 任務訓練結果不穩定性的分析

1. Prompt 我是機器人RL方向的博士生正在學習ManiSkill,在學習時我嘗試使用相同命令訓練同一個任務,但是我發現最終的 success_once 指標并不是相同的,我感到十分焦慮, 我使用的命令如下: python sac.py --env_id"…

文檔權限設置不合理會帶來哪些問題

文檔權限設置不合理會導致信息泄露、合規風險、協作效率下降、責任難以追溯、知識資產流失、員工信任受損、管理成本增加、企業戰略受阻。這些問題不僅影響日常運營,更會對企業的長遠發展構成威脅。根據IBM《2024數據泄露成本報告》,全球企業因數據泄露的…

Linux網絡服務——基礎設置

網絡服務命令1.ping命令作用:測試網絡連通性(使用icmp協議)常見選項:-c:指定ping的次數,默認無限次-I:指定發送請求的網卡[rootlocalhost ~]# ping 192.168.77.78 -c 4 -I ens160 PING 192.168.…

【multisim汽車尾燈設計】2022-12-1

緣由multisim汽車尾燈設計-學習和成長-CSDN問答 為什么模仿別人做的運行沒啥效果,啥也看不明白,數字電子技術要做的任務。

Langchain在調用 LLM 時統計 Token 消耗

關鍵點解析使用上下文管理器with get_openai_callback() as cb:這一行是核心。cb 會自動收集本次調用的 prompt tokens、completion tokens 以及 total tokens。自動統計在上下文退出時,cb 中已經包含了這次調用的消耗情況,無需額外手動計算。累加到全局…

漫談《數字圖像處理》之實時美顏技術

隨著移動拍攝、直播、短視頻等場景的普及,用戶對 “自然、流暢、可控” 的美顏效果需求日益提升 —— 既要消除皮膚瑕疵、優化面部形態,又需避免 “過度磨皮顯假”“變形失真”“實時卡頓” 等問題。實時美顏技術的核心并非單一算法的堆砌,而…

MATLAB基于PSO(粒子群算法)優化BP神經網絡和NSGA-II(非支配排序遺傳算法)多目標優化

代碼實現了一個智能算法優化BP神經網絡并進行多目標優化的完整流程,結合了PSO(粒子群算法)優化BP神經網絡和NSGA-II(非支配排序遺傳算法)多目標優化,用于多輸入多輸出的回歸預測問題。 ? 一、主要功能 數…

白平衡分塊統計數據為什么需要向下采樣?

在白平衡處理中,分塊統計數據時引入**向下采樣(Downsampling)**,核心目標是在保證統計有效性的前提下,解決“計算效率”與“統計魯棒性”的矛盾,同時避免局部噪聲對白平衡判斷的干擾。要理解這一設計的必要…

Deathnote: 1靶場滲透

Deathnote: 1 來自 <Deathnote: 1 ~ VulnHub> 1&#xff0c;將兩臺虛擬機網絡連接都改為NAT模式 2&#xff0c;攻擊機上做namp局域網掃描發現靶機 nmap -sn 192.168.23.0/24 那么攻擊機IP為192.168.23.128&#xff0c;靶場IP192.168.23.129 3&#xff0c;對靶機進行端口…

windows系統服務器測試部署springboot+vue+mysql項目

1. 后端Java應用啟動 直接使用命令行啟動&#xff08;推薦用于測試&#xff09;&#xff1a; cd C:\Users\Administrator\Desktop\toolset\backed java -jar -Dspring.profiles.activeprod -Dserver.port8083 admin.jar2. 前端靜態文件服務 由于你已經有了dist目錄&#xff0c;…

Java 與 Docker 的最佳實踐

在云原生時代&#xff0c;Docker 已成為應用交付和運行的事實標準。Java 作為企業級開發的主力語言&#xff0c;也需要與容器技術深度結合。然而&#xff0c;Java 程序天然有 JVM 內存管理、啟動速度、鏡像體積 等特點&#xff0c;如果不做優化&#xff0c;可能導致性能下降甚至…

大數據工程師認證推薦項目:基于Spark+Django的學生創業分析可視化系統技術價值解析

&#x1f496;&#x1f496;作者&#xff1a;計算機編程小央姐 &#x1f499;&#x1f499;個人簡介&#xff1a;曾長期從事計算機專業培訓教學&#xff0c;本人也熱愛上課教學&#xff0c;語言擅長Java、微信小程序、Python、Golang、安卓Android等&#xff0c;開發項目包括大…

【MySQL自學】SQL主鍵使用誤區:你必須知道的關鍵細節

在日常數據庫操作中&#xff0c;主鍵&#xff08;Primary Key&#xff09;是我們最常打交道的概念之一。然而&#xff0c;許多開發者&#xff0c;尤其是初學者&#xff0c;常常對其存在一些誤解。一個非常經典的問題是&#xff1a;“在SQL中&#xff0c;只要用到主鍵&#xff0…

Electron 執行python腳本

1 需求背景 有個需求需要Electron執行在本地執行python腳本。希望通過Electron調用python服務并且實現雙向通信。 2 解決思路 使用Electon 的{ exec, spawn, execFile, fork } from "child_process"; 能力來執行python腳本&#xff0c;使用spawn可以實現持續交互&…

Leetcode高頻 SQL 50 題(基礎版)題目記錄

Leetcode sql題目記錄 文章目錄Leetcode sql題目記錄570. 至少有5名直接下屬的經理1934. 確認率1193. 每月交易I1174. 即時食物配送II176. 第二高的薪水&#xff08;1&#xff09; 子查詢為空但外層用了聚合函數&#xff08;2&#xff09;子查詢為空而外層沒有聚合函數550. 游戲…

RAGFlow切分方法詳解

RAGFlow 各切分方法的含義如下,結合文檔結構、場景特點等設計,以適配不同類型的知識源: 1. General(通用分塊) 邏輯:結合文本排版、格式、語義關聯等因素確定分割點,再根據“建議文本塊大小(Token 數)”,將文本切分為合適的塊。 支持格式:DOCX、EXCEL、PPT、IMAGE、…

支付域——支付與交易概念

摘要本文詳細闡述了支付域中支付與交易的核心概念及其相互關系。交易是商品或服務交換的過程&#xff0c;包含多個要素并產生訂單或合同。支付則是資金流轉的過程&#xff0c;是交易的資金結算環節。支付交易結合了兩者&#xff0c;根據不同場景提供多樣化的支付產品和服務。文…

(自用)cmd常用命令自查文檔

&#xff08;自用&#xff09;cmd常用命令自查文檔 Windows CMD 常用命令自查1. 文件與目錄操作命令說明示例?cd?顯示或切換目錄?cd?&#xff1b;cd C:\Windows??dir?列出目錄內容?dir?&#xff1b;dir /a?(含隱藏文件)?md?或mkdir?創建目錄?md test?&#xff1…

劇本殺APP系統開發:引領娛樂行業新潮流的科技力量

在當今數字化時代&#xff0c;科技的力量正深刻地改變著人們的生活方式和娛樂習慣。娛樂行業也不例外&#xff0c;各種新興的娛樂形式和平臺如雨后春筍般涌現。劇本殺APP系統開發作為科技與娛樂融合的產物&#xff0c;正以其獨特的魅力和創新的模式&#xff0c;引領著娛樂行業的…

LangChain框架深度解析:定位、架構、設計邏輯與優化方向

LangChain框架深度解析&#xff1a;定位、架構、設計邏輯與優化方向 引言 在大語言模型&#xff08;LLM&#xff09;應用開發的浪潮中&#xff0c;LangChain作為最具影響力的開發框架之一&#xff0c;為開發者提供了構建復雜AI應用的完整工具鏈。本文將從框架定位、實現邏輯、設…