校招mysql MVCC原理機制

2022-06-05 07:30:10 字數 3645 閱讀 9432

mvcc實現原理

整體流程

彩蛋rr和rc隔離級別下的innodb快照讀有什麼區別

閒聊【邁莫coding】

寫《校招mysql那些事》系列文章,一方面幫助在校大學生可以提早知道大廠的面試過程,了解大廠究竟需要什麼樣人才,自己該如何進行準備,全力以赴;另一方面也是自我鞏固知識,因為我也是從校招進入大廠的,自己也經歷過痛並快樂的過程,也希望可以把我自己的經驗,都吐露出來。

接下來我會寫很多關於校招文章,比如《校招redis那些事》,《校招go那些事》,《校招kafka那些事》等等,敬請期待。

多版本併發控制(mvcc),是一種用來解決讀-寫衝突的無鎖併發控制,也就是為事務分配單向增長的時間戳,為每個修改儲存乙個版本,版本與事務戳關聯,讀操作唯讀事務開始前的資料庫的快照。這樣在讀操作的時候不會阻塞寫操作,寫操作不會阻塞讀操作的同時,也避免了髒讀和不可重複讀。

在學mvcc多版本併發控制之前,先了解一下什麼是mysql innodb下的當前讀和快照讀?

這樣組合的方式最大程度的提高資料庫併發效能,解決讀寫衝突以及寫寫衝突所導致的問題。

mvcc就是多版本併發控制,用來解決讀寫衝突。它主要由隱藏字段,undolog日誌,read-view來配合完成的。所以先看看這幾個屬性,理解其含義,便於理解mvcc實現原理。

隱藏欄位中除了咱們自定義的字段外,還隱含著其他屬性字段,是系統預設給加上去的,比如roll_pointer,trx_id等字段。

roll_pointer

回滾指標,指向這條記錄的上乙個版本

trx_id

事務id,記錄建立/修改這條記錄的事務id,用於版本比較,從而找到快照

name

agetrx_id

roll_pointer(回滾指標)

邁莫22

10x1654u

如表中所示,name和age屬性為使用者自定義屬性,而trx_id和roll_pointer就表示隱藏屬性,資料庫預設新增。在這錶中,trx_id表示操作這條記錄的事務id,roll_pointer是回滾指標,表示指向上乙個版本,一般配合undolog日誌使用

undolog日誌儲存某條記錄的所有操作,以鍊錶方式將各個版本進行串聯起來

第一步:比如有個事務1向person表中插入一條資料,記錄如下,name為邁莫,age為22,事務id為1,回滾指標假設為null,如下圖所示

第二步:此時又來乙個事務2,對該記錄的age值進行修改,修改為23

首先將事務1的操作記錄新增到undolog日誌中

將事務2的操作記錄作為資料的最新記錄

將事務2中隱藏欄位roll_pointer(回滾指標)指向事務1,進行串聯

第三步:又有乙個事務3,對該記錄的name值進行操作,修改為memolei

首先將事務2的操作記錄遷移到undolog日誌中

將事務3的操作記錄作為資料的最新記錄

將事務3中隱藏欄位roll_pointer(回滾指標)指向事務2,進行串聯

從上面圖可以看到,每當有事務對該資料進行操作時,首先會將操作前最新資料遷移到undolog日誌中,將當前事務操作的記錄作為最新資料,並且將隱藏欄位roll_pointer指向上乙個版本

當事務第一次執行查詢sql時會生成一致性檢視read-view,它由執行查詢時所有未提交事務id陣列(陣列裡最小的id為min_id)和已建立的最大事務id(max_id)組成,查詢的資料結果需要跟read-view做比較從而得到快照結果

版本鏈比對規則:

如圖表所示,有四個事務,分別為translation2,translation3,translation4,translation5;translation2,translation3,translation4分別對資料庫進行修改操作,translation5進行查詢操作。

當translation2對persion表中id為1的資料進行修改時,首先會將該記錄操作作為最新記錄,並且roll_pointer指向上乙個版本,但尤於translation2未commit,所以translation2仍然為未提交事務

當translation3對persion表中id為1的資料進行修改時,首先會將該記錄操作作為最新記錄,並且roll_pointer指向上乙個版本,但尤於translation3未commit,所以translation3仍然為未提交事務

當translation4對persion表中id為1的資料進行修改時,首先會將該記錄操作作為最新記錄,並且roll_pointer指向上乙個版本,但尤於translation4已commit,所以translation4為已提交事務

translation5進行select語句查詢時,並且由於其是第一次建立查詢語句,所以會建立read-view一致性檢視。read-view一致性檢視是由未提交事務id陣列和最大事務id組成,由表中可知,當translation5進行查詢時,translation2和translation3都為未提交事務,translation4為已提交事務,所以,read-view中未提交事務id陣列由translation2和translation3組成,最大事務id為translation4,所以max_id為translation5,min_id為translation2

接下來的話,就需要進行版本鏈比較(若不記得版本鏈比較規則回去溫習一下),由於read-view由未提交事務陣列[1,2]和最大事務id3組成。由於當前最新記錄事務id為4,4大於最大事務id3,所以無法檢視;進行回溯,到undolog日誌查詢,事務3在未提交事務陣列中,也就是中間這一段,由於事務三不在未提交事務陣列中,說明事務3為已提交事務,因此是可見的,最終結果為name="memolei"

到此,mvcc整個流程處理完了,一遍生,二遍熟,溫故而知新。

總之在rc隔離級別下,是每個快照讀都會生成並獲取最新的read view;而在rr隔離級別下,則是同乙個事務中的第乙個快照讀才會建立read view, 之後的快照讀獲取的都是同乙個read view。

Mysql MVCC機制原理詳解

mvcc,全稱multi version concurrency control,即多版本併發控制。mvcc是一種併發控制的方法,一般在資料庫管理系統中,實現對資料庫的併發訪問,在程式語言中實現事務記憶體。我們知道,一般情況下我們使用mysql資料庫的時候使用的是innodb儲存引擎,innodb儲...

mvcc原理 MySQL MVCC原理

1 mvcc基本原理 mvcc 多版本併發控制 mvcc,multiversion currency control 一般情況下,事務性儲存引擎不是只使用表鎖,行加鎖的處理資料,而是結合了mvcc機制,以處理更多的併發問題。mvcc處理高併發能力最強,但系統開銷 比最大 較表鎖 行級鎖 這是最求高併...

理解MYSQL MVCC 實現機制

1.1 什麼是mvcc mvcc是一種多版本併發控制機制。1.2 mvcc是為了解決什麼問題?1.3 mvcc實現 mvcc是通過儲存資料在某個時間點的快照來實現的.不同儲存引擎的mvcc.不同儲存引擎的mvcc實現是不同的,典型的有樂觀併發控制和悲觀併發控制.下面,我們通過innodb的mvcc實...