mvcc的概念
mvcc即多版本併發控制,是一種併發控制的策略,能讓數據庫在高併發下做到安全高效的讀寫,提升數據庫的併發性能;
是一種用來解決併發下讀寫衝突的無鎖解決方案,爲事務分配單向增長時間戳,爲每次修改保存一個版本,版本號與時間戳關聯;
可解決的問題
1、在併發讀寫數據庫時,可以做到在讀操作時不用阻塞寫操作,寫操作也不用阻塞讀操作,提高了數據庫併發讀寫的性能
2、解決髒讀、幻讀、不可重複讀等事務隔離問題,但是不能解決更新丟失問題
前置概念
當前讀
讀取數據的最新版本,讀取時需保證其他併發事務不能修改當前記錄,會對讀取的記錄加鎖;如insert,update,delete,for update等語句會走當前讀
快照讀
讀的可能並不是最新數據,可能是歷史數據;要求事務隔離級別不能是串行,串行級別下快照讀會轉爲當前讀;
mvcc實現的三大要素
圖示:
隱式字段
數據庫的每行記錄除了記錄顯示的數據外,還會有一些隱藏字段,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前就已提交,則對當前事務可見,具體見圖: