欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL多版本并發(fā)控制MVCC深入學(xué)習(xí)

 更新時間:2021年11月28日 16:10:50   作者:CJ-cooper  
這篇文章主要介紹了MySQL多版本并發(fā)控制MVCC,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

MVCC

MVCC(Multi-Version Concurrency Control),即多版本并發(fā)控制。是 innodb 實現(xiàn)事務(wù)并發(fā)與回滾的重要功能。鎖機制可以控制并發(fā)操作,但是其系統(tǒng)開銷較大,而MVCC可以在大多數(shù)情況下代替行級鎖,使用MVCC,能降低其系統(tǒng)開銷.

具體實現(xiàn)是在數(shù)據(jù)庫的每一行中,額外添加三個字段:

  1. DB_TRX_ID : 記錄插入或更新該行的最后一個事務(wù)的事務(wù)ID
  2. DB_ROLL_PTR : 指向改行對應(yīng)undolog 的指針
  3. DB_ROW_ID : 單調(diào)遞增的ID,他就是AUTO_INCREMENT的主鍵ID

快照讀

像不加鎖的select操作就是快照讀,快照讀的出現(xiàn)是基于提高并發(fā)性能的考慮,快照讀的實現(xiàn)是基于多版本并發(fā)控制,即MVCC。可以認(rèn)為 MVCC 是行鎖的一個變種,在很多情況下,避免了加鎖操作,降低了開銷;既然是基于多版本,即快照讀可能讀到的并不一定是數(shù)據(jù)的最新版本,而有可能是之前的歷史版本

當(dāng)前讀

讀取的是當(dāng)前的數(shù)據(jù),不需要通過undo log回溯到事務(wù)開啟前的狀態(tài)。讀取的是記錄的最新版本,讀取時還要保證其他并發(fā)事務(wù)不能修改當(dāng)前記錄,會對讀取的記錄進(jìn)行加鎖。

數(shù)據(jù)庫并發(fā)場景有三種,分別為:

  • 讀-讀:不存在任何問題,也不需要并發(fā)控制
  • 讀-寫:有線程安全問題,可能會造成事務(wù)隔離性問題,可能遇到臟讀,幻讀,不可重復(fù)讀
  • 寫-寫:有線程安全問題,可能會存在更新丟失問題,比如第一類更新丟失,第二類更新丟失

說白了 MVCC 就是為了實現(xiàn)讀-寫沖突不加鎖,而這個讀指的就是快照讀, 而非當(dāng)前讀,當(dāng)前讀實際上是一種加鎖的操作,是悲觀鎖的實現(xiàn)

MVCC的出現(xiàn)就是大佬們不滿意用悲觀鎖去解決讀-寫沖突問題,所以有兩個方案:

  • MVCC + 悲觀鎖
    MVCC解決讀寫沖突,悲觀鎖解決寫寫沖突
  • MVCC + 樂觀鎖
    MVCC 解決讀寫沖突,樂觀鎖解決寫寫沖突

MVCC實現(xiàn)原理

三個隱藏字段

  • DB_TRX_ID
    6 字節(jié),最近修改(修改/插入)事務(wù) ID:記錄創(chuàng)建這條記錄/最后一次修改該記錄的事務(wù) ID
  • DB_ROLL_PTR
    7 字節(jié),回滾指針,指向這條記錄的上一個版本(存儲于 rollback segment 里)
  • DB_ROW_ID
    6 字節(jié),隱含的自增 ID(隱藏主鍵),如果數(shù)據(jù)表沒有主鍵,InnoDB 會自動以DB_ROW_ID產(chǎn)生一個聚簇索引

版本鏈 / undo log

因為undo log會記錄事務(wù)前老版本數(shù)據(jù),然后行記錄中回滾指針會指向老版本位置,如此形成一條版本鏈。Read View 會一直遍歷鏈表的DB_TRX_ID,直到找到滿足特定條件的 DB_TRX_ID。那么這個DB_TRX_ID所在的舊記錄就是當(dāng)前事務(wù)能看見的最新”老版本“

Read View

是事務(wù)開啟時,當(dāng)前所有活躍事務(wù)(還未提交的事務(wù))的一個集合?;蛘哒fRead View 就是事務(wù)進(jìn)行快照讀操作的時候生產(chǎn)的讀視圖 (Read View),在該事務(wù)執(zhí)行的快照讀的那一刻,會生成數(shù)據(jù)庫系統(tǒng)當(dāng)前的一個快照,記錄并維護系統(tǒng)當(dāng)前活躍事務(wù)的 ID

三個Read View重要結(jié)構(gòu):

  • trx_list(名稱我隨意取的)
    一個數(shù)值列表
    用于維護 Read View 生成時刻系統(tǒng) 正活躍的事務(wù) ID 列表
  • up_limit_id
    是 trx_list 列表中事務(wù) ID 最小的 ID
  • low_limit_id

ReadView 生成時刻系統(tǒng)尚未分配的下一個事務(wù) ID ,也就是 目前已出現(xiàn)過的事務(wù) ID 的最大值 + 1

為什么是 low_limit ? 因為它也是系統(tǒng)此刻可分配的事務(wù) ID 的最小值

MVCC實現(xiàn)的整體流程:

總結(jié)

  • 應(yīng)對高并發(fā)事務(wù), MVCC比單純的加鎖更高效
  • MVCC只在 讀已提交 和 可重復(fù)讀 兩個隔離級別下工作
  • 讀已提交隔離級別下,會在每次快照讀(查詢)都生成一個Read View,可重復(fù)讀只在事務(wù)開始時生成一個Read View,以后每次查詢都用這個Read View,以此實現(xiàn)不同隔離級別。

參考:

【MySQL筆記】正確的理解MySQL的MVCC及實現(xiàn)原理_(推薦)

MySQL · 引擎特性 · InnoDB 事務(wù)系統(tǒng) (taobao.org)

mvcc詳解 - 簡書 (jianshu.com)

到此這篇關(guān)于MySQL多版本并發(fā)控制MVCC深入學(xué)習(xí)的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySQL Workbench的使用方法(圖文)

    MySQL Workbench的使用方法(圖文)

    這篇文章主要介紹了MySQL Workbench的使用方法(圖文) ,需要的朋友可以參考下
    2016-02-02
  • 超全MySQL學(xué)習(xí)筆記

    超全MySQL學(xué)習(xí)筆記

    本文詳細(xì)介紹了MySQL索引優(yōu)化、鎖和事物等學(xué)習(xí)記錄,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • 詳解MySQL8的新特性ROLE

    詳解MySQL8的新特性ROLE

    這篇文章主要介紹了詳解MySQL8的新特性ROLE的相關(guān)資料,幫助大家更好的理解和使用MySQL8,感興趣的朋友可以了解下
    2020-11-11
  • SQL計算timestamp的差值的方法

    SQL計算timestamp的差值的方法

    這篇文章主要介紹了SQL計算timestamp的差值的方法的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • mysql中的mvcc?原理詳解

    mysql中的mvcc?原理詳解

    MVCC多版本并發(fā)控制,是用來在數(shù)據(jù)庫中控制并發(fā)的方法,實現(xiàn)對數(shù)據(jù)庫的并發(fā)訪問用的,這篇文章主要介紹了mysql?mvcc?原理詳解,需要的朋友可以參考下
    2022-10-10
  • MySql 字符串中提取數(shù)字的實現(xiàn)示例

    MySql 字符串中提取數(shù)字的實現(xiàn)示例

    在MySQL中,有時需要從字符串中提取數(shù)字,本文就來介紹一下MySql 字符串中提取數(shù)字的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Mysql基礎(chǔ)學(xué)習(xí)之LAG與LEAD開窗函數(shù)

    Mysql基礎(chǔ)學(xué)習(xí)之LAG與LEAD開窗函數(shù)

    lead和lag是在SQL中用于創(chuàng)建窗口函數(shù)的兩個常用函數(shù),這篇文章主要給大家介紹了關(guān)于Mysql基礎(chǔ)學(xué)習(xí)之LAG與LEAD開窗函數(shù)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • mysql5.6.zip格式壓縮版安裝圖文教程

    mysql5.6.zip格式壓縮版安裝圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql5.6.zip格式壓縮版安裝圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Windows?Server?2019?MySQL數(shù)據(jù)庫的安裝與配置理論+遠(yuǎn)程連接篇

    Windows?Server?2019?MySQL數(shù)據(jù)庫的安裝與配置理論+遠(yuǎn)程連接篇

    mysql是一款關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由MySQL?AB公司開發(fā),目前屬于Oracle旗下產(chǎn)品,MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一。MySQL也是一款開源的SQL數(shù)據(jù)庫管理系統(tǒng),是眾多小型網(wǎng)站作為網(wǎng)站數(shù)據(jù)庫的首選數(shù)據(jù)庫
    2023-05-05
  • MySQL5.7的sql腳本導(dǎo)入到MySQL5.5出錯3種解決方案

    MySQL5.7的sql腳本導(dǎo)入到MySQL5.5出錯3種解決方案

    筆者需要將使用MySQL5.7數(shù)據(jù)庫的網(wǎng)站挪入winows服務(wù)器,目標(biāo)服務(wù)器使用的是MySQL5.5,因為兼顧到以前的網(wǎng)站,MySQL不能升級。遇到MySQL5.7的sql腳本導(dǎo)入到MySQL5.5出錯,總結(jié)了3種解決方案,總有一個方案適合你。
    2023-06-06

最新評論