InnoDB存儲引擎非常重要的一個機制--MVCC(多版本并發控制)

Mysql是如何實現隔離性的?(鎖+MVCC)

隔離性是指一個事務內部的操作以及操作的數據對正在進行的其他事務是隔離的,并發執行的各個事務之間不能相互干擾。隔離性可以防止多個事務并發執行時,可能存在交叉執行導致數據的不一致。

MySQL 對隔離性的保證主要有兩個方面:

--用鎖機制來保證一個事務寫操作對另一個事務寫操作的隔離性,

---用 MVCC 機制來保證一個事務寫操作對另一個事務讀操作的隔離性。

MySQL 中按照鎖的粒度,可以分為全局鎖,表鎖和行鎖。

全局鎖會使整個數據庫處于只讀狀態,在做全庫邏輯備份時經常用到。表級鎖在操作數據時會鎖定整張表,并發性能一般,而行鎖可以做到只鎖定需要操作的記錄行,并發性能很好。但是由于加鎖本身需要消耗資源,因此某些在鎖定數據較多的情況下可以使用表鎖來減少開銷。

MVCC 主要解決的是讀寫沖突的問題它是由 undo log + read view 實現的。其中 undo log 可以為每條記錄保存多個歷史版本,MySQL 在執行快照讀的時候,會根據事務的 read view 里的信息,順著 undo log 的版本鏈找到滿足可見性的記錄。

MVCC-Multi-Version Concurrency Control 多版本并發控制

是指維護一個數據的多個版本,使得讀寫操作沒有沖突,快照讀為MySQL實現MVCC提供了一個非阻塞讀功能。MVCC的具體實現,還需要依賴于數據庫記錄中的三個隱藏字段、undo log日志、readView。

數據庫記錄中的三個(兩個)隱藏字段:

?undo log日志:

多個事務 提交事務之后undo log不會立即刪除.原因是有活動的事務,正在用到這個undo log,結合ReadView..

undo log版本鏈:?

  • 在不同事務/相同事務對同一記錄進行修改,修改過程中會記錄 該記錄的undo log日志。
  • 會導致該記錄的uodo log生成一條記錄版本鏈表。鏈表的頭部是最新的舊記錄,尾部是最早的舊記錄!
  • undo log日志中記錄了當前記錄(行數據)的歷史版本。

查詢時應該返回哪一個版本呢??
具體返回哪個版本,要取決于MVCC實現原理中的readview

ReadView(讀視圖)

ReadView 是 快照讀 SQL執行時MVCC提取數據的依據,記錄并維護系統當前活躍的事務(未提交的)id。

?版本鏈數據訪問規則:

?不同的隔離級別,生成ReadView的時機不同:
- RC: 在事務每次快照讀的時候,都會產生一個新的ReadView....(里面維護著當前活動的事務ID)
- RR: 在事務第一次快照讀的時候,會產生一個新的ReadView,后續的每次快照讀都會復用第一個ReadView..(里面維護著當前活動的事務ID)

(這是造成 不可重復讀 和 幻讀的本質原因)

RC隔離級別下:

每次快照讀的時候,會從當前記錄的最新版本開始,和ReadView中的字段,通過版本鏈數據訪問規則開始對比。如果符合就返回當前 版本記錄,如果不符合,就按照版本鏈的鏈表往下繼續做對比,直到找到符合規則的那個版本返回。。

因為RC(讀已提交)隔離級別下每次快照讀都是新的ReadView,所以維護的活動事務ID集合m_ids都可能不一樣,所以會有不可重復讀的現象出現!(問題根源)

比如上圖:一次快照讀是{3,4,5},一次快照讀是{4,5}

RR隔離級別下:

第一次快照讀,會產生一個ReadView,分別記錄四個屬性,接下來第二個快照讀的時候,不會再生成一個ReadView了 ,直接復用第一個,所以匹配規則也都 一樣,在undo log版本鏈中查找時查出來的數據 也都一樣,這就保證了 可重復讀!

所以:MVCC--?它的主要作用就是在 快照讀 的時候,決定我們提取的到底是哪一個版本

總結:

擴展:

1、當前讀

當前讀就是讀取到的是最新的數據!通過select .. lock in share mode(共享鎖)實現,或通過select ...for update、update、insert、delete(排它鎖)等實現!

?2、快照讀

3、在InnoDB存儲引擎下的RR隔離級別下:

  • 快照讀會使用MVCC. (select * ... 普通sql語句)
  • 當前讀會采用Next-Key-Lock,是行鎖 + 間隙鎖的方式來處理(鎖機制). ?(select ..lock in share mode/for ..update ?update ?insert delete)??

4、 RR級別下 快照讀 使用了MVCC一定能避免幻讀嗎?
- 能,但不完全能!
- 因為MVCC并不是采用鎖的方式完全的對事務數據進行了隔離,而是通過版本控制變相的實現了解決幻讀的功能

特例:當兩次快照讀之間存在當前讀,ReadView會重新生成,會導致產生幻讀。

?MVCC在快照讀的情況下可以解決幻讀問題,但是在當前讀的情況下是不能解決幻讀的

5、RR可重復讀隔離下為什么會產生幻讀?

在可重復讀隔離級別下,普通的查詢是快照讀,是不會看到別的事務插入的數據的(因為復用同一個 ReadView)。因此,幻讀在?當前讀?下才會出現。

SELECT * FROM player LOCK IN SHARE MODE;
SELECT * FROM player FOR UPDATE;
INSERT INTO player values ...
DELETE FROM player WHERE ...
UPDATE player SET ...

6、什么是幻讀
在可重復讀的數據隔離級別下,在同一個事務中,使用當前讀,讀到了其他事務新插入的數據的現象叫做幻讀。這里有幾個定語:可重復讀的事務隔離級別,當前讀,插入的新數據。只有在這些定語的約束下?才能形成幻讀。?

我們知道可重復讀的數據隔離級別下,一個事務無法查詢到另外一個事務對數據表進行的變更,不過,這個結論的前提是,這個查詢是一個普通查詢,也就是快照讀,如果查詢的方式是當前讀(select * from table for update),那么就可以查詢到另外一個事務的變更結果的。但是"幻讀"的定義,對"變更"又做了更嚴格的限制,幻讀,只僅僅針對 "insert" 的變更,而對 "update" 的變更,雖然查詢也可以感知到,但這不會被稱為幻讀。雖然這里說的有點啰嗦,但是幻讀的定義就是那么嚴格,所以我要多強調一遍。

我們在使用MVCC的時候,一般是根據業務場景選擇組合搭配,樂觀鎖或悲觀鎖。

MVCC用來解決讀寫沖突問題,樂觀鎖或者悲觀鎖用來解決寫和寫的沖突。從而最大程度的提高數據庫的并發性?。

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

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

相關文章

安全U盤和普通U盤有什么區別?

安全U盤(也稱為加密U盤或安全閃存驅動器)與普通U盤肯定是有一些區別的,從字面意思上來看,就能看出,安全U盤是能夠保護文件數據安全性的,普通U盤沒這一些功能的,可隨意拷貝文件,不防盜…

面試4:c++(數位物聯)

1.const 關健字的作用 定義常量,防止變量被意外修改,增強程序的可讀性和維護性。 可以用于指針,聲明指向常量的指針或常量指針。 2.static關健字的作用 (1)在函數內,用于修飾局部變量,使其生命周期延長到整個程序運行期…

mybatisplus多數據源內置方法報Invalid bound statement (not found)

在用mybatis-plus多數據源時用mapper內置的 selectList(queryWrapper) 查詢數據報org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 問題是在配置多數據源時用的是SqlSessionFactoryBean,改為MybatisSqlSessionFactoryBean即可…

Python怎么逐行處理文件:深度解析與實用技巧

Python怎么逐行處理文件:深度解析與實用技巧 在Python中,逐行處理文件是一項常見且重要的任務。無論是讀取大型日志文件、分析文本數據還是處理配置文件,逐行讀取都能幫助我們更有效地管理內存并提高處理速度。本文將詳細介紹Python中逐行處…

一文了解UVLED線光源的應用

在機器視覺系統中,光源作為不可或缺的一部分,能夠提高目標成像效果,增強檢測效果。光源的選擇至關重要,選到不合適的會影響成像及檢測效果。針對不同的檢測對象,不同的形狀光源應運而生。我們來看看最UVLED線光源。 下面以CCS的光…

某紅書旋轉滑塊驗證碼分析與協議算法實現

文章目錄 1. 寫在前面2. 接口分析3. 驗證軌跡4. 算法還原【??作者主頁】:吳秋霖 【??作者介紹】:擅長爬蟲與JS加密逆向分析!Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走來長期堅守并致力于Python與爬蟲領域研究與開發工作! 【??作者推…

zoomeye api報錯 request invalid, validate usage and try again

項目場景: 調用zoomeye的api接口進行數據拿取 問題描述 之前接口一直通著今天突然報錯,以下為源代碼 pip install zoomeye from zoomeye.sdk import ZoomEye zm ZoomEye(api_key"34A8B452-D874-C63E0-8471-F3D4f89766f") zm.dork_search(a…

圖片像素縮放,支持個性化自定義與精準比例調整,讓圖像處理更輕松便捷!

圖片已經成為我們生活中不可或缺的一部分。無論是社交媒體的分享,還是工作文檔的編輯,圖片都扮演著至關重要的角色。然而,你是否曾經遇到過這樣的問題:一張高清大圖在上傳時卻受限于平臺的大小要求,或者一張小圖需要放…

Spring MVC 源碼分析之 DispatcherServlet#processDispatchResult方法

前言: 前面的篇章我們分析了 Spring MVC 工作流程中的 HandlerMapping、HandlerAdapter 的適配過程、攔截器的工作流程,以及處理業務請求的過程,本篇我們分析一下處理完業務解析視圖的方法,也就是 DispatcherServlet#processDisp…

提高篇(二):高級繪圖技巧:在Processing中創造精美圖形

提高篇(二):高級繪圖技巧:在Processing中創造精美圖形 引言 Processing不僅是一種編程語言,更是一個用于創意編程的強大工具。掌握高級繪圖技巧,可以讓你在藝術創作中如虎添翼。在本篇文章中,我們將探索貝塞爾曲線、樣條曲線、自定義形狀、圖形變換等高級繪圖技術,幫助…

tkinter+火山引擎+python實現語音識別聊天機器人

想要做一款能通過語音識別來聊天的智能機器人,首先需要能通過麥克風錄制語音進行識別轉換成文字,將文字發送給機器人得到聊天結果,并能將返回的文字轉換成語音進行合成,之后再通過本地播放語音實現語音交互。 架構: 實現步驟 一、本地錄音 本地錄音可以通過pyAudio庫實…

2024-06-05-記一次cnvd滲透

前言:挖src挖郁悶了,閑來無事選擇挖一個cnvd來練練手,本次的漏洞都沒啥難度,企查查資產過了5000萬 說一下cnvd證書的下放標準 對于中危及中危以上通用型漏洞(CVSS2.0基準評分超過4.0分),以及涉…

Scaling vision Transformer 論文理解

Scaling vision Transformer 論文理解 1. 摘要2. 一些主要結論小結2.1 few shot transfer learning2.2 Pareto-front3. 討論3.1 Limitations3.2 社會作用4. 文章結論參考資料1. 摘要 Attention-based neural networks such as the Vision Transformer (ViT) have recently att…

valgrind-內存泄漏定位工具

1、前言 valgirnd 是一套開放源代碼的動態調試工具集合。能夠檢測內存管理錯誤,線程BUG等。valgirnd是由內核以及基于內核的其他調試工具組成。內核類似于一個框架,它模擬了一個cpu的環境,并提供服務給其他工具使用。而其他工具則類似于插件…

紅酒:紅酒保存中的光照與避免陽光直射

在紅酒保存中,光照是一個常常被忽視的因素。光照對紅酒的影響是不可小覷的,因為陽光中的紫外線會加速紅酒的氧化,導致其口感和品質的下降。因此,在保存云倉酒莊雷盛紅酒時,應特別注意避免陽光直射。 陽光直射對紅酒的影…

企業代碼簽名證書1300元

隨著手機和電腦等設備的普及,越來越多的開發者進入軟件行業,為了軟件的安全性、完整性和可信度,開發者往往會使用由正規CA認證機構頒發的代碼簽名證書對軟件代碼進行數字簽名,來標識軟件的來源和軟件開發者的真實身份。今天就隨SS…

AGI時代下,計算機專業出身的程序員該何去何從?

Easy:單獨開個貼說一下吧。 如果你計算機、軟件工程、通信、電子、網絡等相關專業本科畢業,也考慮前后端/測試崗,戳 技術大廠,6險1金,待遇不錯。 提前說明,一切以古代思維對AGI時代的推演,都是可…

博物館文物庫房管理軟件

博物館作為文化遺產的守護者和傳承者,承載著人類智慧與文明的結晶。在博物館的背后,一個龐大而嚴密的管理系統支撐著文物的保護與展示。而其中,文物庫房管理軟件的使用,無疑是一項重要的管理工具。 文物庫房管理軟件的功能具有多樣…

【CentOS 7】挑戰探索:在CentOS 7上實現Python 3.9的完美部署指南

【CentOS 7】挑戰探索:在CentOS 7上實現Python 3.9的完美部署指南 大家好 我是寸鐵👊 總結了一篇【CentOS 7】挑戰探索:在CentOS 7上實現Python 3.9的完美部署指南詳細步驟? 喜歡的小伙伴可以點點關注 💝 前言 此篇教程只適用于p…

【java前端課堂】05_類的多態

類的多態是面向對象編程的三大特性之一,與封裝和繼承并列。多態性允許我們將父對象設置為與其子對象相等的技術,讓我們可以把一個子對象當作父對象對待。在Java中,多態主要體現在以下三個方面: 方法的重載(Overloadin…