MVCC 是否徹底解決了事物的隔離性 ?

目錄

1. 什么是 MVCC

2. MVCC 是否徹底解決了事物的隔離性

3. MySQL 中如何實現共享鎖和排他鎖

4. MySQL 中如何實現悲觀鎖和樂觀鎖


1. 什么是 MVCC

????????MVCC(Multi-Version Concurrency Control,多版本并發控制)是一種多版本并發控制機制,它通過給每一個操作加上一個版本號,來解決它的隔離性問題!(主要是用來解決幻讀問題

????????它使用了快照讀的方式,將歷史版本的結果集保存到緩存中(ReadView),那么后續需要查詢結果集的時候,就不會進行實時的查詢(當前讀),而是從歷史版本中找到與當前查詢操作所對應的版本號匹配的結果集。(版本號是全局共享的)

????????MVCC 雖然主要用來解決幻讀問題的,它也是可以解決不可重復讀問題的,并且 MVCC 是 MySQL 內置的一個機制,先來看看 MVCC 是如何解決不可重復讀問題的:

數據庫中原數據:

客戶端 1?執行如下操作:

// 1.開啟事物 A  [版本 1]
begin; // 2.查詢 user 表中 id 為 3 的用戶身份信息 [版本 1]
select * from user where id = 3; // 3.等事物 B 執行修改操作后,再次查詢 id 為 3 的用戶 [取緩存中的版本 1]
select * from user where id = 3;

客戶端 2 執行如下操作:

// 開啟事物 [版本 1]
begin;// 等事物 A 執行完第一次查詢操作時,將 id 為 3 的用戶名改為王老五 [版本 2]
update user set name = '王老五' where id= 3;// 提交事物
commit;// 此時可以再開一個客戶端 3,驗證一下數據庫中是否已經是最新數據

?經過上述兩步操作之后,可以得出以下結果 >>

  • 客戶端 1:因為客戶端 1 只執行了開啟事務,并沒有提交事物,所以客戶端 1 第二次查詢得到的數據行的 name 依然是 王五。
  • 客戶端 3?:因為客戶端 2 執行了修改操作,并提交事物,那么客戶端 3 查詢得到的數據行的 name 就變成了 王老五。

MVCC 的核心思想:

????????MVCC 將每個事物的讀和寫操作進行解耦,通過保存數據的歷史版本來實現并發控制。每個事物在開始的時候會創建一個讀視圖(ReadView),用于確定在事物開始時可見的數據版本。在 MVCC 中,當一個事物執行寫操作時,會生成一個新的數據版本并將舊版本的數據保存在回滾日志(Undo Log)中。這樣其他事物在讀取數據時,仍然可以訪問到舊版本的數據,從而避免了幻讀問題和不可重復讀問題。

(歷史版本的數據就類似于對之前查詢出來的結果集拍張照,在當前事物還沒執行完,還需要查詢時,直接從緩存中拿那個版本的照片)

2. MVCC 是否徹底解決了事物的隔離性

????????在面試中如果被問到這個問題了,那么回答沒有徹底解決。雖然 RR 隔離級別中通過 MVCC 解決大部分幻讀問題,但是依然存在幻讀問題。

請看示例,原數據:

?客戶端 1 執行如下操作:

// 事物 A
begin;select * from user where id > 0 and id < 9;// 等待事物 B 執行完新增操作后,使用下面兩種方式進行查詢
select * from user where id > 0 and id < 9; [快照讀]select * from user where id > 0 and id < 9 for update; [當前讀]

客戶端 2 執行如下操作:

begin;// 事物 B 執行新增操作
insert into user(id,name,age,address) values(4,'老六',66,'廣州');commit;

最終執行結果:

  • 事物 A 使用快照讀(讀緩存)的方式,查詢結果集仍然是 3 條,(MVCC機制保護)
  • 事物 A?使用當前讀(實時讀)的方式,查詢結果集變成了 4 條。(存在幻讀問題)

【解決方案】既然 MVCC 也不能解決幻讀問題,那么該怎么解決幻讀問題 ??

  • 方案一:加鎖 + RR隔離級別
  • 方案二:使用串行化隔離級別

MySQL 中如何加鎖,使用 for update?(既是當前讀,也是加鎖),示例:

select * from user where id > 0 and id < 9 for update; // 排他鎖(寫鎖)

????????當事物 A 在執行時,進行鎖表操作,那么事物 B 開啟事物后,想要執行新增操作,但是事物 A 已經執行鎖表操作了,所以事物 B 嘗試獲取鎖,發現獲取不到,一段時間后就放棄了,所以顯示獲取鎖超時的錯誤(默認超時時間為 50s)。

3. MySQL 中如何實現共享鎖和排他鎖

共享鎖也稱為讀鎖,它允許多個事物同時獲取同一數據的共享鎖,用于讀數據。

語法:? select... lock in share mode

select * from user wehre id = 1 lock in share mode;

排他鎖也稱為寫鎖,它只允許一個事物獲取排他鎖,用于修改數據。

語法:?select .... for update

select * from user where id = 1 for update;

4. MySQL 中如何實現悲觀鎖和樂觀鎖

1. 悲觀鎖

悲觀鎖就是通過加上 for update 進行鎖表的操作實現的

2. 樂觀鎖

MySQL 沒有內置樂觀鎖的實現,需要在業務代碼中通過手動指定版本號來實現。

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

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

相關文章

webpack 和 ts 簡單配置及使用

如何使用webpack 與 ts結合使用 新建項目 &#xff0c;執行項目初始化 npm init -y會生成 {"name": "tsdemo01","version": "1.0.0","description": "","main": "index.js","scripts&…

Spring的ApplicationEvent簡單使用

ApplicationEvent以及Listener是Spring為我們提供的一個事件監聽、訂閱的實現&#xff0c;內部實現原理是觀察者設計模式&#xff0c;設計初衷也是為了系統業務邏輯之間的解耦&#xff0c;提高可擴展性以及可維護性。事件發布者并不需要考慮誰去監聽&#xff0c;監聽具體的實現…

自動駕駛數據集匯總

1.Nuscenes 數據集鏈接&#xff1a;nuScenes nuscenes數據集下有多個任務&#xff0c;涉及Detection&#xff08;2D/3D&#xff09;、Tracking、prediction、激光雷達分割、全景任務、規劃控制等多個任務&#xff1b; nuScenes數據集是一個具有三維目標注釋的大型自動駕駛數…

【ARM 嵌入式 編譯系列 10.3 -- GNU elfutils 工具小結】

文章目錄 什么是 GNU elfutils?GNU elfutils 常用工具有哪些?objcopy 常用參數有哪些?GNU binutils和GNU elfutils區別是什么?上篇文章:ARM 嵌入式 編譯系列 10.2 – 符號表與可執行程序分離詳細講解 什么是 GNU elfutils? GNU elfutils是一個開源的工具集,用于處理ELF…

2023-8-15差分矩陣

題目鏈接&#xff1a;差分矩陣 #include <iostream>using namespace std;const int N 1010;int n, m, q; int a[N][N], b[N][N];void insert(int x1, int y1, int x2, int y2, int c) {b[x1][y1] c;b[x1][y2 1] - c;b[x2 1][y1] - c;b[x2 1][y2 1] c; }int main…

基于SOLIDWORKS配置功能建立塑料模具標準件庫

在塑料模具的設計過程中&#xff0c;建立其三維模型對于后續進行CAE分析和CAM加工是非常重要的。除了型腔和型芯以外&#xff0c;塑料模具中的標準件很多&#xff0c;如推桿、導柱、導套、推板、限位釘等&#xff0c;這些對于不同的產品是需要反復調用的。目前&#xff0c;我國…

汽車OTA活動高質量發展的“常”與“新”

伴隨著車主的頻繁崔更&#xff0c;車企除了卷硬件、拼價格&#xff0c;逐漸將精力轉移到汽車全生命周期的常用常新。時至下半年&#xff0c;車企OTA圈愈發熱鬧&#xff0c;以新勢力、新實力為代表新一代車企&#xff0c;OTA運營活動逐漸進入高質量發展期。 所謂高質量&#xf…

記錄--webpack和vite原理

這里給大家分享我在網上總結出來的一些知識&#xff0c;希望對大家有所幫助 前言 每次用vite創建項目秒建好&#xff0c;前幾天用vue-cli創建了一個項目&#xff0c;足足等了我一分鐘&#xff0c;那為什么用 vite 比 webpack 要快呢&#xff0c;這篇文章帶你梳理清楚它們的原理…

FFmpeg 靜態庫編譯錯誤匯總

今天使用靜態庫編譯發現 了錯誤 這個只有在arm64 的編譯上 存在 。armeabi-v7a不存在問題 ld: error: relocation R_AARCH64_ADD_ABS_LO12_NC cannot be used against symbol ff_cos_16384; recompile with -fPIC 解決方案列舉匯總 有很多 大家如果有同樣的問題可以一一測試。…

c++ 虛函數

虛函數的作用就是當一個類繼承另一個類時&#xff0c;兩個類有同名函數&#xff0c;當你使用指針調用時你希望使用子類的函數而不是父類的函數&#xff0c;那么請使用 virutal 和 override 關鍵詞 看代碼&#xff1a; #include <iostream> #include <string> #in…

Kotlin開發筆記:集合和逆變協變

Kotlin開發筆記&#xff1a;集合和逆變協變 Kotlin中的集合 基本的集合類型 Kotlin中的集合類型和Java差不多&#xff0c;不過有些在名稱上可能有出入&#xff0c;下面是Kotlin中的一些基本集合類型&#xff1a; 類型介紹Pair兩個值的元組Triple三個值的元組Array經過索引的…

去掉鼠標系列之一: 語雀快捷鍵使用指南

其實應該是系列之二了&#xff0c;因為前面寫了一個關于Interlij IDEA的快捷鍵了。 為什么要寫這個了&#xff0c;主要是覺得一會兒用鼠標&#xff0c;一會兒鍵盤&#xff0c;一點兒不酷&#xff0c;我希望可以一直用鍵盤&#xff0c;拋開鼠標。后面陸續記錄一下各個軟件的快捷…

高效使用ChatGPT之ChatGPT客戶端

ChatGPT客戶端&#xff0c;支持Mac, Windows, and Linux 下載地址見文章結尾 軟件截圖 Windows: Mac&#xff1a; 說明 chatgpt桌面版&#xff0c;相比于網頁版的chatgpt&#xff0c;最大的特色是支持歷史聊天對話記錄導出&#xff0c;且支持三種格式&#xff1a;PNG、PDF、…

由淺入深詳解四種分布式鎖

在多線程環境下&#xff0c;為了保證數據的線程安全&#xff0c;鎖保證同一時刻&#xff0c;只有一個可以訪問和更新共享數據。在單機系統我們可以使用synchronized鎖或者Lock鎖保證線程安全。synchronized鎖是Java提供的一種內置鎖&#xff0c;在單個JVM進程中提供線程之間的鎖…

小程序的數據綁定和事件綁定

小程序的數據綁定 1.需要渲染的數據放在index.js中的data里 Page({data: {info:HELLO WORLD,imgSrc:/images/1.jpg,randomNum:Math.random()*10,randomNum1:Math.random().toFixed(2)}, }) 2.在WXML中通過{{}}獲取數據 <view>{{info}}</view><image src"{{…

C++ std::thread

若要使用線程類std::thread&#xff0c;則需包含<thread>頭文件。 創建線程 std::thread表示一個線程。線程對象是不可復制或賦值的&#xff0c;但可以移動(move)&#xff0c;如移動構造或移動賦值。 當構造std::thread對象時&#xff0c;需給構造函數輸入一個參數&am…

RocketMQ 5.0 架構解析:如何基于云原生架構支撐多元化場景

作者&#xff1a;隆基 本文將從技術角度了解 RocketMQ 的云原生架構&#xff0c;了解 RocketMQ 如何基于一套統一的架構支撐多元化的場景。 文章主要包含三部分內容。首先介紹 RocketMQ 5.0 的核心概念和架構概覽&#xff1b;然后從集群角度出發&#xff0c;從宏觀視角學習 R…

swift 項目集成友盟推送

1, 需要用橋接文件 , 不然引用不到依賴庫 2, 可以用測試模式測試, 可以debug 3, 測試模式獲取deviceToken, 添加測試設備 deviceToken獲取方法 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { le…

spark使用心得

spark入門 啟停spark sbin/start-all.shsbin/stop-all.shspark-shell 進入spark/bin目錄&#xff0c;執行&#xff1a; ./spark-shell 輸出中有這么一行&#xff1a; Spark context Web UI available at http://xx.xx.xx.188:4040意味著我們可以從web頁面查看spark的運行情…

優測云服務平臺|【壓力測試功能升級】輕松完成壓測任務

一、本次升級主要功能如下&#xff1a; 1.多份報告對比查看測試結果 2.報告新增多種下載格式 Word格式Excel格式 3.新增多種編排復雜場景的控制器 漏斗控制器并行控制器事務控制器僅一次控制器分組控制器集合點 4.新增概覽頁面&#xff0c;包含多種統計維度 二、報告對比…