最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

MVCC

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

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

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

快照讀

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

當(dāng)前讀

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

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

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

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

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

  • MVCC + 悲觀鎖
    MVCC解決讀寫(xiě)沖突,悲觀鎖解決寫(xiě)寫(xiě)沖突
  • MVCC + 樂(lè)觀鎖
    MVCC 解決讀寫(xiě)沖突,樂(lè)觀鎖解決寫(xiě)寫(xiě)沖突

MVCC實(shí)現(xiàn)原理

三個(gè)隱藏字段

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

版本鏈 / undo log

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

Read View

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

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

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

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

為什么是 low_limit ? 因?yàn)樗彩窍到y(tǒng)此刻可分配的事務(wù) ID 的最小值

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

總結(jié)

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

參考:

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

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

mvcc詳解 - 簡(jiǎn)書(shū) (jianshu.com)

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

相關(guān)文章

最新評(píng)論

汤阴县| 嵊州市| 双桥区| 将乐县| 三原县| 敦化市| 醴陵市| 民乐县| 墨脱县| 辛集市| 梨树县| 成武县| 赣州市| 昌乐县| 太康县| 舞钢市| 孟州市| 淮北市| 石楼县| 新闻| 大宁县| 海盐县| 秦安县| 台北市| 大英县| 大同市| 布拖县| 定远县| 镇康县| 黄浦区| 南安市| 洛隆县| 洛浦县| 宁乡县| 鸡东县| 宁明县| 绥中县| 民权县| 华宁县| 台南市| 阿拉善左旗|