??作者簡介:小明java問道之路,專注于研究 Java/ Liunx內核/ C++及匯編/計算機底層原理/源碼,就職于大型金融公司后端高級工程師,擅長交易領域的高安全/可用/并發(fā)/性能的架構設計與演進、系統(tǒng)優(yōu)化與穩(wěn)定性建設。
?? 熱衷分享,喜歡原創(chuàng)~ 關注我會給你帶來一些不一樣的認知和成長。
??
?? InfoQ簽約作者、CSDN專家博主/后端領域優(yōu)質創(chuàng)作者/內容合伙人、阿里云專家/簽約博主、51CTO專家 ??
??
??如果此文還不錯的話,還請??關注、點贊、收藏三連支持??一下博主~?
本文目錄
本文導讀
一、什么是MVCC
二、MVCC的實現(xiàn)原理
1、MVCC多版本實現(xiàn)
2、MVCC 實現(xiàn)原理
3、什么是 Read View
3.1、Read View 解析
3.2、Read View 含義
3.3、Read View 如何判斷版本鏈可用
三、當前讀,快照讀與MVCC
1、什么是當前讀和快照讀
1.1、當前讀
1.2、快照讀
2、快照讀、當前讀與MVCC辨析
3、MVCC 只在 RC 和 RR 隔離級別下工作
總結
本文導讀
本文是:MySQL事務隔離機制與實現(xiàn)原理詳解,的深入學習,我們在了解MySQL事務隔離機制與實現(xiàn)原理后,了解什么是MVCC,MVCC的實現(xiàn)原理,最后辨析當前讀和快照讀與MVCC和事務隔離的關系,更加全面和深入的MySQL事務隔離機制。文章來源地址http://www.zghlxwxcb.cn/news/detail-406996.html
一、什么是MVCC
MVCC,全稱 Multi-Version Concurrency Control ,MVCC是多版本并發(fā)控制的全稱,是指多版本的并發(fā)控制。MVCC是一種并發(fā)控制方法。通常,在數據庫管理系統(tǒng)中,它用編程語言實現(xiàn)對數據庫和事務存儲器的并發(fā)訪問。
MVCC 是一種在讀取數據時無需鎖定(加鎖)即可提高讀取效率和并發(fā)性的方法。
數據庫并發(fā)有以下情況:
1、讀-讀:沒有問題。
2、讀-寫:存在線程安全問題,這可能導致臟讀、幻讀和不可重復讀。
3、寫-寫:存在線程安全問題,更新可能會丟失。
二、MVCC的實現(xiàn)原理
首先我們回顧:MySQL事務隔離機制與實現(xiàn)原理詳解
這里面講解了,事務的特性、事務的隔離級別,當時說MySQL事務實現(xiàn)原理有單版本控制——鎖,以及多版本控制MVCC。
現(xiàn)在我們需要知道,在讀已提交(RC,Read Committed)和可重復讀(RR,Repeatable Read)隔離級別下的快照讀,都是基于MVCC實現(xiàn)的!
MVCC最大的優(yōu)點是沒有讀鎖,讀寫之間沒有沖突。在讀多寫少的OLTP(On-Line Transaction Processing,聯(lián)機事務處理)應用程序中,讀寫之間沒有沖突非常重要,這大大提高了系統(tǒng)的并發(fā)性。
1、MVCC多版本實現(xiàn)
為了讓您更直觀地理解MVCC的實現(xiàn)原理,這里通過事務更新一行記錄的過程的例子,來解釋MVCC中多個版本的實現(xiàn)。
假設 ID~……是表中字段的名稱(DATA)。最后三個隱藏字段對應對應行的隱藏ID、事務編號和回滾指針,如下圖所示:
隱含ID(DB_ROW_ID),6字節(jié),當InnoDB自動生成聚集索引時,聚集索引包括這個DB_ROW_ ID的值。
事務編號(DB_TRX_ID),6字節(jié),它標記了此行最新更新記錄的事務ID。每個事務都被處理,其值自動為+1。
回滾指針(DB_ROLL_PT),7個字節(jié),指向當前記錄項的回滾段的撤消日志記錄,通過該記錄可以找到以前版本的數據。
?
具體更新過程簡述如下:
首先,如果數據只是INSERT,則可以認為ID是 1,其他兩個字段為空。
當 事務1 更改此行的數據值時,將執(zhí)行,一、使用獨占鎖鎖定行,記錄重做日志;二、將修改前這一行的值復制到Undo日志;三、修改當前行的值,填寫事務ID,并使回滾指針指向撤銷日志中修改前的行。
接下來,與 事務1 相同。此時,undo 日志中有兩行記錄,它們由回滾指針連接。
因此,如果撤消日志沒有一直被刪除,那么當前記錄的回滾指針將追溯到創(chuàng)建該行時的初始內容。InnoDB中有一個清除線程,將查詢比最舊的活動事務更早的撤消日志并將其刪除,從而確保撤消日志文件不會無限增長。
2、MVCC 實現(xiàn)原理
它的實現(xiàn)原理主要是依賴記錄中的 3個隱式字段(DB_ROW_ID、DB_TRX_ID、DB_ROLL_PT),undo日志 , Read View 來實現(xiàn)的。
上面我們已經詳細介紹了3個隱式字段的含義,總結一下
默認情況下,DB_ROW_ID 是數據庫為這行記錄生成的唯一隱式主鍵。DB_TRX_ID 是當前操作記錄的事務ID,而 DB_ROLL_PTR 是一個回滾指針,與撤消日志一起使用以指向以前的舊版本。
有兩種 undo 日志:insert undo log、update undo log,幫助MVCC的撤銷的本質是update undo log 。事實上,撤消日志是回滾段中的舊記錄鏈。(MySQL日志系統(tǒng)的詳解:(待補充))。
3、什么是 Read View
什么是 Read View ?
Read View ?是事務執(zhí)行快照讀取操作時生成的視圖。在事務執(zhí)行快照讀取時,將生成數據庫系統(tǒng)的當前快照,并記錄和維護系統(tǒng)當前活動事務的ID(當每個事務啟動時,將分配一個ID,該ID是增量的,因此最新事務的ID值更大)。
當我們使用select讀取數據時,此時會有許多版本的數據,但我們不知道要讀取哪個版本。
此時,我們依賴readview來限制我們可以讀取的版本。只有通過readview才能知道我們可以閱讀哪個版本。
3.1、Read View 解析
Read View主要用于進行可見性判斷,也就是說,當我們?yōu)槭聞請?zhí)行快照讀時,我們會為記錄創(chuàng)建一個讀取視圖 Read View。以判斷當前事務可以看到哪個版本的數據。它可能是當前期間的最新數據,也可能是記錄 undo log 中某個版本的數據。
讀取視圖遵循可見性算法,主要是要修改的數據的最新記錄中的 DB_TRX_ID (即當前事務ID),并與系統(tǒng)中其他活動事務的ID(由讀取視圖 Read View 維護)進行比較。
如果 DB_TRX_ID 跟 Read View 屬性不符合可見性,通過 DB_ROLL_PTR 回滾指針在撤消日志Undo Log中的 DB_TRX_ID 比較中檢索數據庫(遍歷鏈表的 DB_TRX_ID)。
遍歷鏈接列表的DB _ TRX_ ID(從鏈的開始到鏈的結束,即從最近的修改),直到找到滿足特定條件的 DB_TRX_ID , 那么這個 DB_TRX_ID 所在的舊記錄就是當前事務能看見的最新老版本。
3.2、Read View 含義
在一個 Read View 快照中主要包括以下這些字段:
m_ids,表示生成 Read View 時當前系統(tǒng)中活動讀/寫事務的事務ID列表
min_trx_id,表示生成 Read View 時當前系統(tǒng)中活動讀/寫事務中最小的事務ID,即 m_ids 最小值
max_trx_id,表示生成 Read View 時應分配給系統(tǒng)中下一個事務的ID值
creator_trx_id,表示生成 Read View 的事務的事務ID
3.3、Read View 如何判斷版本鏈可用
trx_id == creator_trx_id,可以訪問這個版本;
trx_id < min_trx_id,可以訪問這個版本;trx_id > max_trx_id,不可以訪問這個版本;
min_trx_id <= trx_id <= max_trx_id,如果 trx_id 在 m_ids 中不可以訪問,反之可以
三、當前讀,快照讀與MVCC
1、什么是當前讀和快照讀
1.1、當前讀
select lock in share mode (共享鎖), select for update; update; insert; delete (排他鎖)這些操作都是一種當前讀。
它讀取最新版本的記錄,讀取時,它還確保其他并發(fā)事務無法修改當前記錄,并鎖定讀取的記錄。
1.2、快照讀
不加鎖的 select 操作就是快照讀,即無鎖的非阻塞讀取;
快照讀的前提是隔離級別不是串行級別,在串行級別下讀取的快照將退化為當前讀取,發(fā)生快照讀的原因是基于提高并發(fā)性能的考慮。
快照讀的實現(xiàn)基于多版本并發(fā)控制,即MVCC。MVCC可以被認為是行鎖的變體,但在許多情況下,它避免了鎖操作并減少了開銷;由于它基于多個版本,也就是說,讀取的快照可能不是數據的最新版本,而是以前的歷史版本
MVCC的設計目的是在不鎖定讀寫沖突,這種讀取指的是快照讀取,而不是當前讀取。
當前的讀取實際上是一個鎖操作,這是悲觀鎖的實現(xiàn)
2、快照讀、當前讀與MVCC辨析
MVCC多版本并發(fā)控制的概念是“維護一個數據的多個版本,以便讀寫操作之間沒有沖突”。
因為MVCC只是一個抽象的概念,為了實現(xiàn)這樣的概念,MySQL需要提供特定的功能來實現(xiàn)它?!翱煺兆x取是MySQL MVCC理想模型的非阻塞讀取功能之一”。
相對而言,當前讀是悲觀鎖的具體功能實現(xiàn),快照閱讀本身也是一個抽象概念。
3、MVCC 只在 RC 和 RR 隔離級別下工作
一、 在RC(Read Commited )的隔離級別下,每次快照讀取都會生成并獲得最新的?readview。
二、在RR(Repeatable Read)隔離級別,只有讀取同一事務的第一個快照才能創(chuàng)建?readview。每個后續(xù)快照讀取都使用相同的 readview,因此每個查詢結果都相同。文章來源:http://www.zghlxwxcb.cn/news/detail-406996.html
總結
本文是:MySQL事務隔離機制與實現(xiàn)原理詳解,的深入學習,我們在了解MySQL事務隔離機制與實現(xiàn)原理后,了解什么是MVCC,MVCC的實現(xiàn)原理,最后辨析當前讀和快照讀與MVCC和事務隔離的關系,更加全面和深入的MySQL事務隔離機制。
到了這里,關于【MySQL】MVCC詳解與MVCC實現(xiàn)原理(MySQL專欄啟動)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!