多重版本並發控制(Multi-Version Concurrency Control,MVCC)是指...。 MVCC是一種並發控制的方法,一般在資料庫管理系統中,實現對資料庫的並發訪問,在程式語言中實現事務記憶體。
MVCC在MySQL InnoDB中的實作主要是為了提高資料庫並發效能,用更好的方式去處理讀寫衝突,做到即使有>讀寫衝突時,也能做到不加鎖,非阻塞並發讀。
像select lock in share mode(共享鎖定), select for update ; update, insert ,delete(排他鎖)這些操作都是一種當前讀,為什麼叫目前讀?就是它讀取的是記錄的最新版本,讀取時還要保證其他並發事務不能修改當前記錄,會對讀取的記錄進行加鎖。
像不加鎖的select操作就是快照讀,即不加鎖的非阻塞讀;快照讀的前提是隔離級別不是串行級別,串行級別下的快照讀取會退化成當前讀取;之所以出現快照讀取的情況,是基於提高並發性能的考慮,快照讀的實現是基於多版本並發控制,即MVCC,可以認為MVCC是行鎖的變種,但它在很多情況下,避免了加鎖操作,降低了開銷;既然是基於多版本,即快照讀可能讀到的並不一定是資料的最新版本,而有可能是先前的歷史版本
MVCC多版本並發控制指的是維持一個資料的多個版本,使得讀寫操作沒有衝突,快照讀取是MySQL為實作MVCC的一個非阻塞讀取功能。 MVCC模組在MySQL中的具體實作是由三個隱式字段,undo日誌、read view三個元件來實現的。
mvcc的實作原理主要依賴記錄中的三個隱藏字段,undolog,read view來實現的。
隱藏欄位
行記錄除了我們自訂的欄位外,還有資料庫隱式定義的DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID等欄位
DB_TRX_ID
6字節,最近修改事務id,記錄建立這條記錄或最後一次修改該記錄的交易id
DB_ROLL_PTR
7位元組,回滾指針,指向這條記錄的上一個版本,用於配合undolog,指向上一個舊版本
DB_ROW_JD
#6字節,隱藏的主鍵,如果資料表沒有主鍵,那麼innodb會自動產生一個6字節的row_id
undo log
#undolog被稱之為回滾日誌,表示在進行insert,delete,update操作的時候產生的方便回滾的日誌當進行insert操作的時候,產生的undolog只在事務回滾的時候需要,並且在交易提交之後可以立刻丟棄當進行update和delete操作的時候,產生的undolog不僅僅在事務回滾的時候需要,在快照讀的時候也需要,所以不能隨便刪除,只有在快照讀或事務回滾當不涉及該日誌時,對應的日誌才會被purge線程統一清除(當資料發生更新和刪除操作的時候都只是設定一下舊記錄的deleted_bit,並不是真正的將過時的記錄刪除,因為為了節省磁碟空間,innodb有專門的purge線程來清除deleted_bit為true
的記錄,如果某個記錄的deleted_id為true
,並且DB_TRX_ID相對於purge線程的read view 可見,那麼這條記錄一定時可以被清除的)
Read View
Read View是交易進行快照讀操作的時候生產的讀視圖,在該事務執行快照讀的那一刻,會產生一個資料系統目前的快照,記錄並維護系統目前活躍事務的id,事務的id值是遞增的。
MVCC 的核心思想是: 我可以查到在我這個事務開始之前已經存在的數據,即使它在後面被修改或刪除了。在我這個事務之後新增的數據,我是查不到的。
MVCC尋找規則:只能尋找建立時間小於等於目前交易ID的資料和刪除時間大於目前交易ID的行(或未刪除)
#如圖,在Transaction1事務中插入兩個數據,並提交事務,然後在Transaction2事務中讀取,讀取到兩個數據
#如圖,在Transaction3事務中插入一條為老連的數據,然後在Transaction2事務讀取,根據mvcc規則,不能查到在我的事務開始之後插入插入的數據,老連的創建ID大於2,所以只能查到兩個資料
如圖,在Transaction4事務中刪除id為2的數據,然後在Transaction2事務讀取,根據mvcc規則,可以查到在我的事務開始之後插刪除的數據,老晁還是可以查出來所以還是查到兩個數據
#如圖,在Transaction5事務中下,添加一條name=濤哥的數據,刪除id= 1數據,修改name=濤哥的id為1,然後在Transaction2事務讀取,根據mvcc規則,可以查到在我的事務開始之後插刪除的數據,老嚴還是可以查出來,所以還是查到兩條資料
透過上述示範我們能看到,透過版本號碼的控制,無論其他交易是插入、修改、刪除,Transaction2事務查詢到的資料都沒有變化。
以上是Mysql MVCC多版本並發控制的知識點有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!