mysql是如何實現mvcc的

mvcc的概念

mvcc即多版本併發控制,是一種併發控制的策略,能讓數據庫在高併發下做到安全高效的讀寫,提升數據庫的併發性能;
是一種用來解決併發下讀寫衝突的無鎖解決方案,爲事務分配單向增長時間戳,爲每次修改保存一個版本,版本號與時間戳關聯;

可解決的問題

1、在併發讀寫數據庫時,可以做到在讀操作時不用阻塞寫操作,寫操作也不用阻塞讀操作,提高了數據庫併發讀寫的性能
2、解決髒讀、幻讀、不可重複讀等事務隔離問題,但是不能解決更新丟失問題

前置概念

當前讀

讀取數據的最新版本,讀取時需保證其他併發事務不能修改當前記錄,會對讀取的記錄加鎖;如insert,update,delete,for update等語句會走當前讀

快照讀

讀的可能並不是最新數據,可能是歷史數據;要求事務隔離級別不能是串行,串行級別下快照讀會轉爲當前讀;

mvcc實現的三大要素

圖示:

image

隱式字段

數據庫的每行記錄除了記錄顯示的數據外,還會有一些隱藏字段,mvcc用到了其中三個,如下:
1.DBTRXID 最後修改該條記錄的事務id,
2.DBROLLPTR 回滾指針,用於定位undolog中的歷史記錄,指向該記錄的上一版本
3.DBROWJD 隱藏的主鍵

undoLog

即回滾日誌,用於記錄每條記錄歷史版本數據的日誌文件,當update,insert,delete等語句執行時記錄歷史版本數據,方便出錯時回滾

readview

定義

readview是事務進行快照讀操作的時候生產的讀視圖,在該事務執行快照讀的那一刻,會生成一個數據系統當前的快照,記錄並維護系統當前活躍事務的id,事務的id值是遞增的;可用來作可見性判斷,當事務對某一記錄執行快照讀的時候會產生一個readview視圖,可把它當做一個條件去判斷當前事務能讀到該數據的哪個版本,有可能讀的是當前最新數據,也有可能讀的是undolog中的歷史數據

可見性判斷規則

可見性判斷的前提需要理解三個字段的概念:
	trx_list:維護Read View生成時刻系統正活躍的事務ID
	up_limit_id:記錄trx_list列表中事務ID最小的ID
	low_limit_id:Read View生成時刻系統尚未分配的下一個事務ID
比較可見性:
	將記錄的隱式字段DBTRXID拿出來與up_limit_id比較,如果小於表示DBTRXID在up_limit_id之前就生成了,屬於歷史數據,則對當前事務可見;
	如果大於則繼續判斷DBTRXID>=low_limit_id,如果大於等於則表示DBTRXID是生成readview過後才產生的,則該記錄不可見;
	如果DBTRXID<low_limit_id則需判斷DBTRXID在不在當前活躍的事務列表trx_list中,如果在列表中則不可見,否則表示該事務再生成readView前就已提交,則對當前事務可見,具體見圖:

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章