RR(Repeatable Read)級別如何防止幻讀

在這里插入圖片描述

在 MySQL 數據庫事務隔離級別中,RR(可重復讀) 通過 MVCC(多版本并發控制)鎖機制 的組合策略來避免幻讀問題。


一、MVCC機制:快照讀與版本控制

  1. 快照讀(Snapshot Read)

    • 每個事務啟動時生成一個全局唯一的 事務版本號,所有 SELECT 操作基于該版本號讀取數據的快照(歷史版本),而非最新數據。
    • 快照規則
      • 僅讀取 創建版本號 ≤ 當前事務版本號 的數據行。
      • 忽略 刪除版本號 ≤ 當前事務版本號 或未標記刪除的數據行。
    • 效果:同一事務內多次讀取同一范圍的數據時,結果一致(即使其他事務插入新數據并提交)。
  2. 版本更新規則

    • INSERT:新插入行的創建版本號設為當前事務版本號。
    • DELETE:標記刪除行的刪除版本號為當前事務版本號。
    • UPDATE:拆分為刪除舊行(標記刪除版本號)和插入新行(設置新創建版本號)。

二、鎖機制:當前讀與間隙鎖

  1. 當前讀(Current Read)

    • 對數據修改操作(UPDATE/INSERT/DELETE/SELECT FOR UPDATE),強制讀取最新數據版本并加鎖。
    • 鎖類型
      • 記錄鎖(Row Lock):鎖定單行數據。
      • 間隙鎖(Gap Lock):鎖定索引記錄間的間隙,阻止其他事務插入新數據。
      • 臨鍵鎖(Next-Key Lock):記錄鎖 + 間隙鎖的組合,鎖定一個左開右閉的區間(如 (5, 10])。
  2. 間隙鎖的作用

    • 防止范圍插入:例如事務 A 查詢 age BETWEEN 20 AND 30 的數據并加間隙鎖,事務 B 嘗試插入 age=25 的數據會被阻塞,直到事務 A 提交或回滾。
    • 覆蓋索引與非唯一索引:即使查詢條件未命中實際數據行,間隙鎖仍會鎖定符合條件的索引范圍。

三、MySQL InnoDB 的特殊實現

  1. RR 與 Serializable 的折中

    • 快照讀:通過 MVCC 避免幻讀(如普通 SELECT 操作)。
    • 當前讀:通過間隙鎖強制串行化,阻止其他事務插入新數據。
    • 實際效果:在 MySQL 的 RR 級別下,幾乎不會出現幻讀(與標準 SQL 定義的 RR 存在差異)。
  2. 示例場景

    -- 事務 A
    START TRANSACTION;
    SELECT * FROM users WHERE age BETWEEN 20 AND 30; -- 快照讀,無幻讀
    UPDATE users SET name='Alice' WHERE age=25;      -- 當前讀觸發間隙鎖
    -- 事務 B 插入 age=25 的數據;-- 因為間隙鎖存在,阻塞事務 B 的插入
    COMMIT;
    
  3. mysql 幻讀問題
    mysql幻讀是通過MVCC和臨鍵鎖、間隙鎖避免的,但在一些特殊場景下,還是會出現幻讀問題:事務中快照讀當前讀同時存在時就會出現幻讀問題

    -- 事務A
    BEGIN;
    SELECT * FROM users WHERE age > 20;  -- 快照讀,未加鎖
    -- 事務B插入age=25的數據并提交
    -- 事務A執行當前讀
    SELECT * FROM users WHERE age > 20 FOR UPDATE;  -- 當前讀,返回包含事務B插入的新數據,發生幻讀
    

四、與其他數據庫的對比

數據庫RR 實現方式是否完全避免幻讀
MySQL InnoDBMVCC + 間隙鎖是(近似)
PostgreSQLMVCC(無間隙鎖)
Oracle多版本讀一致性(無間隙鎖)

五、應用注意事項

  1. 顯式加鎖的必要性

    • 若需完全避免幻讀,應在事務中對查詢范圍顯式加鎖(如 SELECT ... FOR UPDATE)。
    • 僅依賴快照讀可能無法覆蓋高并發場景下的嚴格一致性需求。
  2. 性能權衡

    • 間隙鎖的代價:鎖定范圍可能降低并發寫入性能。
    • 索引設計優化:合理設計索引(如唯一索引)可減少間隙鎖的覆蓋范圍。

總結

MySQL 的 RR 隔離級別通過 MVCC 快照讀間隙鎖 的組合,在大多數場景下有效避免了幻讀問題。其實現機制兼顧了性能與一致性,但需注意不同數據庫的差異及實際業務中顯式鎖的使用需求。對于嚴格防幻讀的場景,可升級至 Serializable 級別或通過應用層邏輯補充控制。

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

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

相關文章

Android運行時ART加載類和方法的過程分析

目錄 一,概述 二,ART運行時的入口 一,概述 既然ART運行時執行的都是翻譯DEX字節碼后得到的本地機器指令了,為什么還需要在OAT文件中包含DEX文件,并且將它加載到內存去呢?這是因為ART運行時提供了Java虛擬機接口,而要實現Java虛…

Javase 基礎加強 —— 02 泛型

本系列為筆者學習Javase的課堂筆記,視頻資源為B站黑馬程序員出品的《黑馬程序員JavaAI智能輔助編程全套視頻教程,java零基礎入門到大牛一套通關》,章節分布參考視頻教程,為同樣學習Javase系列課程的同學們提供參考。 01 認識泛型…

Oracle VirtualBox 在 macOS 上的詳細安裝步驟

Oracle VirtualBox 在 macOS 上的詳細安裝步驟 一、準備工作1. 系統要求2. 下載安裝包二、安裝 VirtualBox1. 掛載安裝鏡像2. 運行安裝程序3. 處理安全限制(僅限首次安裝)三、安裝擴展包(增強功能)四、配置第一個虛擬機1. 創建新虛擬機2. 分配內存3. 創建虛擬硬盤4. 加載系…

RAGFlow 接入企業微信應用實現原理剖析與最佳實踐

背景 近期有醫美行業客戶咨詢我們智能客服產品,期望將自己企業的產品、服務以及報價信息以企微應用的方式給到客戶進行體驗互動,提升企業運營效率。關于企業微信對接,我們分享下最佳實踐,拋磚引玉。效果圖如下: 這里也…

【心海資源】子比主題新增注冊與會員用戶展示功能模塊及實現方法

內容改寫: 本次分享的是子比主題頂部展示注冊用戶與會員信息的功能模塊及其實現方式。 你可以通過兩種方式啟用該功能: 直接在后臺進入“外觀 → 小工具”啟用該展示模塊,操作簡便;也可將提供的代碼覆蓋至子比主題目錄中&#…

CSDN積分詳解(介紹、獲取、用途)

🤟致敬讀者 🟩感謝閱讀🟦笑口常開🟪生日快樂?早點睡覺 📘博主相關 🟧博主信息🟨博客首頁🟫專欄推薦🟥活動信息 文章目錄 積分**一、積分類型及用途****二、積分獲取途…

【iview】es6變量結構賦值(對象賦值)

變量的解構賦值 以iview的src/index.js中Vue.prototype.$IVIEW改造為例練習下怎么使用變量的解構賦值 原來的寫法: const install function(Vue, opts {}) {if (install.installed) return;locale.use(opts.locale);locale.i18n(opts.i18n);Object.keys(iview).fo…

【c++深入系列】:萬字詳解vector(附模擬實現的vector源碼)

🔥 本文專欄:c 🌸作者主頁:努力努力再努力wz 💪 今日博客勵志語錄: 種子破土時從不問‘會不會有光’,它只管生長 ★★★ 本文前置知識: 模版 1.什么是vector 那么想必大家都學過順…

MySQL基礎關鍵_007_DQL 練習

目 錄 一、題目 二、答案(不唯一) 1.查詢每個部門薪資最高的員工信息 2.查詢每個部門高于平均薪水的員工信息 3. 查詢每個部門平均薪資等級 4.查詢部門中所有員工薪資等級的平均等級 5.不用分組函數 max 查詢最高薪資 6.查詢平均薪資最高的部門編…

Jenkis安裝、配置及賬號權限分配保姆級教程

Jenkis安裝、配置及賬號權限分配保姆級教程 安裝Jenkins下載Jenkins啟動Jenkins配置Jenkins入門Jenkins配置配置中文配置前端自動化任務流新建任務拉取代碼打包上傳云服務并運行配置后端自動化任務流新建任務拉取代碼打包上傳云服務并運行賬號權限分配創建用戶分配視圖權限安裝…

虛函數 vs 純虛函數 vs 靜態函數(C++)

🧩 一圖看懂:虛函數 vs 純虛函數 特性虛函數(Virtual)純虛函數(Pure Virtual)語法virtual void foo();virtual void foo() 0;是否必須實現? 必須在類中實現? 不在基類實現,派生類必須實現是…

2025年滲透測試面試題總結-拷打題庫36(題目+回答)

網絡安全領域各種資源,學習文檔,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具,歡迎關注。 目錄 2025年滲透測試面試題總結-拷打題庫36 PHP代碼常見入口函數查找 PHP框架路由方法熟悉度 PHP變量覆蓋…

STL之vector容器

vector的介紹 1.vector是可變大小數組的容器 2.像數組一樣,采用連續的空間存儲,也就意味著可以通過下標去訪問,但它的大小可以動態改變 3.每次的插入都要開空間嗎?開空間就要意味著先開臨時空間,然后在拷貝舊的到新…

[學成在線]22-自動部署項目

自動部署 實戰流程 下邊使用jenkins實現CI/CD的流程。 1、將代碼使用Git托管 2、在jenkins創建任務,從Git拉取代碼。 3、拉取代碼后進行自動構建:測試、打包、部署。 首先將代碼打成鏡像包上傳到docker私服。 自動創建容器、啟動容器。 4、當有代…

74HC123的電路應用場景

74HC123的電路應用場景 **1. 引腳功能示例****2. 核心功能****(1)單穩態觸發器****(2)雙獨立通道****(3)靈活觸發方式** **3. 工作原理****4. 典型應用場景****(1)定時與延時控制***…

【人工智能】大模型安全的深度剖析:DeepSeek漏洞分析與防護實踐

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著大語言模型(LLM)的廣泛應用,其安全性問題日益凸顯。DeepSeek作為中國領先的開源AI模型,以低成本和高性能著稱,但近期暴露的數據庫…

《ESP32音頻開發實戰:I2S協議解析與WAV音頻錄制/播放全指南》

前言 在智能硬件和物聯網應用中,音頻處理能力正成為越來越重要的功能——無論是語音交互、環境音采集,還是音樂播放,都離不開高效的音頻數據傳輸與處理。而I2S(Inter-IC Sound)作為專為音頻設計的通信協議&#xff0c…

大數據實時數倉的數據質量監控解決方案

實時數倉不僅僅是傳統數據倉庫的升級版,它更強調數據的實時性、流動性和高可用性,通過對海量數據的即時處理和分析,為企業提供近乎實時的洞察力。這種能力在金融、零售、制造、互聯網等行業中尤為關鍵,例如,電商平臺可以通過實時數倉監控用戶行為,動態調整推薦算法;金融…

56認知干貨:智能化產業

如果在不久的未來,一座高樓大廈的建設,只需將圖紙輸入系統,無數臺機器人就能精準協作完成任務; 電影節的主角不再是人類,動漫與影視作品將不再需要人類創作; 當播種和收獲的工作無人參與,所有過程都能自動化進行; 這將預示著我們將迎來一個智能化社會,在這個社會中,…

使用synchronized關鍵字同步Java線程

問題 在Java多線程編程中,你需要保護某些數據,防止多個線程同時訪問導致數據不一致或程序錯誤。 解決方案 在需要保護的方法或代碼段上使用synchronized關鍵字。 討論 synchronized關鍵字是Java提供的同步機制,用于確保在同一時刻只有一…