国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

揭秘MySQL多版本并發控制實現原理

數據庫 MySQL
MySQL 中多版本并發控制(MVCC),是現代數據庫引擎實現中常用的處理讀寫沖突的手段,MVCC 作為 MySQL 高級應用特性,目的在于提高數據庫高并發場景下的吞吐性能。

 MySQL 中多版本并發控制(MVCC),是現代數據庫引擎實現中常用的處理讀寫沖突的手段,MVCC 作為 MySQL 高級應用特性,目的在于提高數據庫高并發場景下的吞吐性能。

一、MVCC出現背景是什么?

事務的4個隔離級別以及對應的3種異常:

  • 臟讀:一個事務讀取到了另外一個事務沒有提交的數據;

  • 不可重復讀: 在同一事務中,兩次讀取同一數據,得到內容不同;

  • 幻讀: 同一事務中,用同樣的操作讀取兩次,得到的記錄數不相同。

在 MySQL 中, 默認的隔離級別是可重復讀 ,可以解決臟讀和不可重復讀的問題,但不能解決幻讀問題。如果我們想要解決幻讀問題,就需要采用串行化的方式,也就是將隔離級別提升到最高,但這樣一來就會大幅降低數據庫的事務并發能力。

而MVCC就是通過樂觀鎖的方式來解決不可重復讀和幻讀問題,它可以在大多數情況下替代行級鎖,降低系統的開銷。

MySQL 并發事務會引起更新丟失問題,解決辦法是鎖,主要分兩類:

  • 樂觀鎖:

    其實現如同它的名字一樣,是假設比較好的情況。

    每次取數據的時候都認為他人不會對其修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號機制和CAS算法實現。

  • 悲觀鎖:

    悲觀鎖也如同它的名字一樣,總是假設比較壞的情況,每次取數據的時候都認為他人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖(共享資源每次只給一個線程使用,其它線程阻塞,用完后再把資源轉讓給其它線程)。

二、什么是MVCC,它解決了什么問題?

MVCC 是通過數據行的多個版本管理來實現數據庫的并發控制,簡單來說它的思想就是保存數據的歷史版本。

我們可以通過比較版本號決定數據是否顯示出來(具體的規則后面會介紹到),讀取數據的時候不需要加鎖也可以保證事務的隔離效果。

通過 MVCC 我們可以解決以下幾個問題:

(1)讀寫之間阻塞的問題,通過 MVCC 可以讓讀寫互相不阻塞,即讀不阻塞寫,寫不阻塞讀,這樣就可以提升事務并發處理能力。

(2)降低了死鎖的概率。這是因為 MVCC 采用了樂觀鎖的方式,讀取數據時并不需要加鎖,對于寫操作,也只鎖定必要的行。

(3)解決一致性讀的問題。一致性讀也被稱為快照讀,當我們查詢數據庫在某個時間點的快照時,只能看到這個時間點之前事務提交更新的結果,而不能看到這個時間點之后事務提交的更新結果。

解釋一下可能難以理解的幾個詞匯:

  • 快照讀:

    讀取的是快照數據,不加鎖的簡單的SELECT都屬于快照讀(只是普通的讀操作)。

  • 當前讀:

    當前讀就是讀取最新數據,而不是歷史版本的數據。

    加鎖的SELECT,或者對數據進行增刪改都會進行當前讀(包括加鎖的讀取和DML操作)。

三、應用舉例分析

為了更好地讓大家理解MVCC,我們用一個示例場景來說明。

假設有個賬戶金額表 user_balance,包括三個字段,分別是 username 用戶名、balance 余額和 bankcard 卡號,表數據如下所示:

用戶 A 和用戶 B 之間進行轉賬,此時數據庫管理員想要查詢 user_balance 表中的總金額,兩個場景存在并發情況,在沒有MVCC的情況下,會出現哪些問題呢。

Case1 :因為需要采用加行鎖的方式,用戶 A 給 B 轉賬時間等待很久,如下圖所示。

Case2 :當我們讀取的時候用了加行鎖,可能會出現死鎖的情況,如下圖所示。

比如當我們讀到 A 有 1000 元的時候,此時 B 開始執行給 A 轉賬。

四、InnoDB如何實現MVCC?

當查詢一條記錄的時候,執行流程如下:

  1. 首先獲取事務自己的版本號,也就是事務 ID;

  2. 獲取 Read View;

  3. 查詢得到的數據,然后與 Read View 中的事務版本號進行比較;

  4. 如果不符合 ReadView 規則,就需要從 Undo Log 中獲取歷史快照;

  5. 最后返回符合規則的數據。

相關概念

1. 事務版本號

一個自增長的事務ID,用于標記事務執行的先后順序。

2. Read View

在 MVCC 機制中,多個事務對同一個行記錄進行更新會產生多個歷史快照,這些歷史快照保存在 Undo Log 里。如果一個事務想要查詢這個行記錄,需要讀取哪個版本的行記錄呢?

這時就需要用到 Read View 了,它幫我們解決了行的可見性問題。Read View 保存了當前事務開啟時所有活躍(還沒有提交)的事務列表,換個角度,可以理解為 Read View 保存了不應該讓這個事務看到的其他的事務 ID 列表。

Read VIew 中的幾個重要屬性:

  • up_limit_id,活躍的事務中最小的事務 ID;

  • trx_ids,系統當前正在活躍的事務 ID 集合;

  • low_limit_id,活躍的事務中最大的事務 ID;

  • creator_trx_id,創建這個 Read View 的事務 ID。

3. 行記錄的隱藏列

InnoDB 的葉子節點段存儲了數據頁,數據頁中保存了行記錄,在這些行記錄中有一些重要的隱藏字段:

  • DB_ROW_ID :

    6-byte,記錄操作該數據事務的事務ID;

  • DB_TRX_ID :

    6-byte,當創建表沒有合適的索引作為聚集索引時,會用該隱藏ID創建聚集索引;

  • DB_ROLL_PTR :

    7-byte,回滾指針,指向上一個版本數據在undo log 里的位置指針;

4. 聚集索引

聚集索引是指數據庫表行中數據的物理順序與鍵值的邏輯(索引)順序相同。一個表只能有一個聚集索引,因為一個表的物理順序只有一種情況,所以,對應的聚集索引只能有一個。

5. Undo Log

InnoDB 將行記錄快照保存在 Undo Log,可以在回滾段中找到它們,主要用于記錄數據被修改之前的日志,在對表信息做修改之前先會把數據拷貝到Undo Log里,當事務進行回滾時可以通過Undo Log里的日志進行數據還原。

回滾段中回滾指針間關聯關系,如下圖所示:

五、InnoDB是如何解決幻讀的?

1、在讀已提交的情況下,即使采用了 MVCC 方式也會出現幻讀

我們同時開啟事務 A 和事務 B,先在事務 A 中進行某個條件范圍的查詢,讀取的時候采用排它鎖,在事務 B 中增加一條符合該條件范圍的數據,并進行提交,然后我們在事務 A 中再次查詢該條件范圍的數據,就會發現結果集中多出一個符合條件的數據,這樣就出現了幻讀。

出現幻讀的原因是在讀已提交的情況下,InnoDB 只采用記錄鎖(Record Locking)。

InnoDB 三種行鎖的方式:

  • 記錄鎖:

    針對單個行記錄添加鎖。

  • 間隙鎖(Gap Locking):

    可以鎖住一個范圍(索引之間的空隙),但不包括記錄本身。

    采用間隙鎖的方式可以防止幻讀情況的產生。

  • Next-Key 鎖:

    鎖住一個范圍,同時鎖定記錄本身,相當于間隙鎖 + 記錄鎖,可以解決幻讀的問題。

2、在可重復讀的情況下,InnoDB 可以通過 Next-Key 鎖 +MVCC 來解決幻讀問題。

想插入球員艾利克斯·倫(身高 2.16 米)的時候,事務 B 會超時,無法插入該數據。

這是因為采用了 Next-Key 鎖,會將 height>2.08 的范圍都進行鎖定,就無法插入符合這個范圍的數據了。然后事務 A 重新進行條件范圍的查詢,就不會出現幻讀的情況。

六、總結

MVCC 的核心就是 Undo Log+ Read View。

  • “MV”就是通過 Undo Log 來保存數據的歷史版本,實現多版本的管理;

  • “CC”是通過 Read View 來實現管理,通過 Read View 原則來決定數據是否顯示。

同時針對不同的隔離級別,Read View 的生成策略不同,也就實現了不同的隔離級別。

 

責任編輯:張燕妮 來源: 架構精進之路
相關推薦

2018-08-20 16:00:23

MySQL并發控制MVCC

2011-08-17 10:11:34

MySQL數據庫MVCC

2025-05-19 08:05:00

數據庫MVCCMySQL

2009-11-16 09:05:47

PostgreSQLInnoDB多版本并發控制

2017-08-21 10:56:55

MySQL并發控制

2023-12-06 08:23:16

MVCCmysql

2021-08-02 09:01:05

MySQL 多版本并發數據庫

2019-07-24 11:30:54

程序員技能開發者

2020-09-22 08:52:50

平臺實現消息

2021-04-07 06:00:18

JavaScript 前端并發控制

2021-01-12 10:22:45

JavaScript并發控制前端

2022-04-08 08:32:40

mobx狀態管理庫redux

2025-06-12 05:00:00

@Autowired自動裝配實現機制

2024-10-10 17:46:06

2009-02-09 10:06:03

并發控制Web應用悲觀鎖

2025-03-20 06:48:55

性能優化JDK

2021-05-13 23:30:17

JavaScript 原理揭秘

2020-02-25 16:48:35

AndroidGoogle 移動系統

2025-01-03 09:36:22

Nginx高并發進程

2023-01-30 18:44:45

MVCC事務
點贊
收藏

51CTO技術棧公眾號

欧美日韩电影免费看| 国产欧美一区二区精品久久久| www国产精品av| 精选一区二区三区四区五区| 豆花视频一区二区| 亚洲色图五月天| 国产黄网站在线观看| 欧美日韩免费区域视频在线观看| 高清一区二区视频| 国产河南妇女毛片精品久久久| 91久久久久久久久久| 国内精品久久久久久久久电影网| 久久久国产一区二区三区| heyzo高清中文字幕在线| 在线视频亚洲一区| 一级二级三级在线观看| 亚洲伦理在线精品| 成人免费视频网站在线看| 久久夜色精品国产欧美乱极品| 日本高清视频免费在线观看| 九九国产精品视频| www.亚洲一区二区| 麻豆精品在线看| 26uuu成人| 国产成人免费视频网站高清观看视频| 视频在线99| 麻豆精品一二三| 国产卡一卡二在线| 成人免费va视频| www.浪潮av.com| aaa国产一区| www.av毛片| 99久久国产综合精品麻豆| 日日鲁鲁鲁夜夜爽爽狠狠视频97| av成人老司机| 国产黄色一级网站| 日本一区二区免费在线观看视频| 第四色亚洲色图| 亚洲人成人一区二区在线观看| 黄色av地址| 色婷婷狠狠综合| 69久久精品| 欧美r级在线观看| 欧美无毛视频| 久久久999精品免费| 日韩av不卡一区| 91精品国产自产在线老师啪| 黄色日韩在线| 日本午夜精品电影| 成人久久视频在线观看| 色琪琪原网站亚洲香蕉| 欧美日韩国产页| 主播国产精品| 欧美成人精品不卡视频在线观看| 国产不卡av一区二区| 国产在线一区二| 国产精品456露脸| а√最新版在线天堂| 在线观看91精品国产入口| 青春草视频在线| 久久亚洲精品中文字幕冲田杏梨| 在线一级成人| 欧美一卡2卡3卡4卡无卡免费观看水多多| 国产激情一区二区三区桃花岛亚洲| 宅男噜噜噜66国产免费观看| 欧美性videos高清精品| 91超碰在线| 国内久久久精品| 日韩视频二区| 五十路熟女丰满大屁股| 亚洲精品国产一区二区精华液 | 精品久久久久久久人人人人传媒 | 成人婷婷网色偷偷亚洲男人的天堂| 99热99热| 亚洲大片av| 久久精品色图| 国产成人精品a视频一区www| 床上的激情91.| 亚洲欧美另类图片| 在线观看免费亚洲| 欧美a视频在线| 国产精品一区二区三区免费视频| 精品在线观看免费| 欧美一区日韩一区| 日韩精品一区国产| 日韩性感在线| 久久久这里只有精品视频| 99久久99久久精品国产片果冰| 91久久伊人青青碰碰婷婷| aaa国产一区| 激情不卡一区二区三区视频在线| 日韩精品一区二区免费| 一级做a爱片久久| 国产亚洲激情| 欧美高清dvd| 欧美成人合集magnet| 亚洲国产你懂的| 亚洲欧洲日韩精品在线| 先锋成人影音| 肥熟一91porny丨九色丨| 亚洲欧美偷拍另类a∨色屁股| 日本女人一区二区三区| 免费日韩av片| 国产精品mv在线观看| 色婷婷精品视频| 精品日韩在线播放| 91精品国产色综合久久久蜜香臀| 美女视频一区| 视频一区二区在线观看| 精品国产精品三级精品av网址| 日本妇女一区| 国产黄页在线观看| 色综合视频网站| 欧美成人vps| www.欧美精品一二区| 首页欧美精品中文字幕| 黄色在线播放| 日韩h在线观看| 国内精品视频在线观看| 国产精品第一| 欧美xxxhd| 国产青青草在线| 激情丁香婷婷| 日韩精品高清在线| 日韩专区中文字幕一区二区| 一个人看的免费视频色| 欧美激情在线视频二区| 99久久伊人网影院| 国产综合色在线观看| 亚洲一区 在线播放| 精品国产1区2区3区| 亚洲自拍另类| a天堂中文在线官网在线| 精品国产91亚洲一区二区三区www| 欧美视频在线免费看| 999久久久免费精品国产| 亚洲男男gay视频| 国产精品成人播放| 亚洲国产精品欧美一二99| 欧美日韩一区二区三区视频播放| 99reav2| 91国产视频在线播放| 亚洲视频免费观看| 波多野结衣一区| 深夜福利视频在线免费观看| 亚洲一区二区在线播放| 欧美日韩亚洲综合| 日韩二区在线观看| 另类专区亚洲| 5月婷婷6月丁香| 国内伊人久久久久久网站视频 | 日本不卡免费新一二三区| 欧美日韩国产系列| 玖玖玖国产精品| 黄色综合网址| 激情网站五月天| 国产精品精品久久久| 在线精品视频小说1| 久色成人在线| 韩国成人动漫| 在线视频日韩一区| 日本欧美黄网站| 亚洲精品国产一区| 国产精品无码专区av在线播放 | av网站大全在线| 欧美日韩在线直播| 欧美mv日韩mv国产网站| 色噜噜狠狠成人中文综合| 神马亚洲视频| 精品国产乱码久久久久久丨区2区| 日韩欧美国产午夜精品| 久久激情婷婷| 99久久国产综合色|国产精品| 欧美国产视频| 欧美亚洲在线观看| 欧美视频中文字幕在线| 国产视频亚洲| 欧美性aaa| 骚视频在线观看| 精品免费视频123区| 日韩hd视频在线观看| 亚洲素人一区二区| 欧美一区久久| 黑人巨大精品| 理论片鲁丝二区爱情网| 日本午夜精品一区二区| 久久久精品在线| 欧美少妇bbb| 国产欧美日韩在线| 夜久久久久久| 国产一区二区三区亚洲综合| 欧美新色视频| 男人天堂新网址| 91在线观看免费高清| 国产亚洲欧美aaaa| 欧美最猛黑人xxxxx猛交| 91网站最新网址| 国产亚洲欧洲| 欧美精品一二| 欧美天堂一区二区|