深入理解Mysql中的MVCC
MVCC多版本并發(fā)控制機制
同樣的sql查詢語句在一個事務 里多次執(zhí)行查詢結(jié)果相同,就算其它事務對數(shù)據(jù)有修改也不會影響當前事務sql語句的查詢結(jié)果, 這個隔離性就是靠MVCC(Multi-Version Concurrency Control)機制來保證的。
對一行數(shù)據(jù)的讀和寫兩個操作默認 是不會通過加鎖互斥來保證隔離性,避免了頻繁加鎖互斥,而在串行化隔離級別為了保證較高的隔離性是通過將所有操 作加鎖互斥來實現(xiàn)的。 Mysql在讀已提交和可重復讀隔離級別下都實現(xiàn)了MVCC機制。
MVCC的具體實現(xiàn),還需要依賴于數(shù)據(jù)庫記錄中的三個隱式字段、undo log日志、readView。
三個隱式字段如下
隱藏字段 | 含義 |
db_trx_id | 最近修改事務id,記錄插入這條記錄或最后一次修改該記錄的事務id。 |
db_roll_ptr | 回滾指針,指向這條記錄的上一個版本,用于配合undo log,指向上一個版本。 |
db_row_id | 隱藏主鍵,如果表結(jié)構(gòu)沒有指定主鍵,將會生成該隱藏字段。 |
- undo log,回滾日志,在insert、update、deletel的時候產(chǎn)生的便于數(shù)據(jù)回滾的日志。
- 當insert的時候,產(chǎn)生的undo log日志只在回滾時需要,在事務提交后,可被立即刪除。
- 而update、deletel的時候,產(chǎn)生的undo log日志不僅在回滾時需要,在快照讀時也需要,不會立即被刪除。
undo log日志版本鏈是指一行數(shù)據(jù)被多個事務依次修改過后,在每個事務修改完后,Mysql會保留修改前的數(shù)據(jù)undo log回滾日志,并且用兩個隱藏字段db_trx_id和db_roll_ptr把這些undo log日志串聯(lián)起來形成一個歷史記錄版本鏈
不同事務或相同事務對同一條記錄進行修改,會導致該記錄的undolog生成一條記錄版本鏈表,鏈表的頭部是最新的舊記錄,鏈表尾部是最早的舊記錄。
版本鏈數(shù)據(jù)訪問規(guī)則 ①.trx_id==creator_trx_id?可以訪問該版本成立,說明數(shù)據(jù)是當前這個事務更改的。
②.trx_id<min_trx_id?可以訪問該版本成立,說明數(shù)據(jù)已經(jīng)提交了。
③.trx_id>max_trx_id?不可以訪問該版本成立,說明該事務是在ReadView生成后才開啟。
④.min_trx_id<=trx_id<=max_trx_id?如果trx_id不在mids中是可以訪問該版本的成立,說明數(shù)據(jù)已經(jīng)提交。
readView(讀視圖)是快照讀SQL執(zhí)行時MVCC提取數(shù)據(jù)的依據(jù),記錄并維護系統(tǒng)當前活躍的事務(未提交的)id。 Readview中包含了四個核心字段:
字段 | 含義 |
m_ids | 當前活躍的事務ID集合 |
min_trx_id | 最小活躍事務ID |
max_trx_id | 預分配事務D,當前最大事務D+1(因為事務D是自增的) |
creator_trx_id | ReadView創(chuàng)建者的事務D |
不同的隔離級別,生成ReadView的時機不同:
- Read committed(讀已提交):在事務中每一次執(zhí)行快照讀時生成ReadView。
- Repeatable Read(可重復讀) :僅在事務中第一次執(zhí)行快照讀時生成ReadView,后續(xù)復用該ReadView。
總結(jié)
MVCC機制的實現(xiàn)就是通過read-view機制與undo版本鏈比對機制,使得不同的事務會根據(jù)數(shù)據(jù)版本鏈對比規(guī)則讀取 同一條數(shù)據(jù)在版本鏈上的不同版本數(shù)據(jù)。
到此這篇關(guān)于深入理解Mysql中的MVCC的文章就介紹到這了,更多相關(guān)Mysql中的MVCC內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL復制三種模式:同步、異步、半同步復制有什么區(qū)別?
作為數(shù)據(jù)庫領域的"快遞小哥",MySQL復制技術(shù)承擔著數(shù)據(jù)運輸?shù)闹厝?今天我們就來聊聊這個數(shù)據(jù)世界的"快遞服務"——同步復制、異步復制、半同步復制到底有什么區(qū)別?為什么金融系統(tǒng)必須用半同步?電商大促時又該如何選擇?讓我們用最接地氣的方式揭開這些復制技術(shù)的神秘面紗2025-03-03Lost connection to MySQL server at ''reading authorization p
這篇文章主要介紹了Lost connection to MySQL server at 'reading authorization packet', system error: 0錯誤解決方法,需要的朋友可以參考下2014-08-08mysql-connector-java與Mysql、Java的對應版本問題
這篇文章主要介紹了mysql-connector-java與Mysql、Java的對應版本問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11