程序員的公眾號:源1024,獲取更多資料,無加密無套路!
最近整理了一波電子書籍資料,包含《Effective Java中文版 第2版》《深入JAVA虛擬機》,《重構改善既有代碼設計》,《MySQL高性能-第3版》,《Java并發編程實戰》等等
獲取方式: 關注公眾號并回復 電子書 領取,更多內容持續奉上
MVCC(Multi-Version Concurrency Control),即多版本并發控制,是一種數據庫的并發控制機制。
MVCC是一種用來解決讀寫沖突的無鎖并發控制,到底解決了什么問題呢?
在并發讀寫時,可以在讀操作時不阻塞寫操作,寫操作時也不阻塞讀操作,提高了數據庫并發讀寫的性能。
解決臟讀、幻讀、不可重復讀等事務隔離問題。
MVCC原理:
主要依賴于記錄中的三個隱藏字段、undolog,read view來實現。
-
隱藏字段
?????每行記錄都隱含DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID三個字段。
?????DB_TRX_ID:記錄創建這條記錄或者最后一次修改該記錄的事務id
?????DB_ROLL_PTR:回滾指針,指向上一個舊版本
?????DB_ROW_ID:隱藏的主鍵
-
undolog
回滾日志,在進行insert,delete,update操作的時候產生的方便回滾的日志。
-
Read View
事務進行快照讀操作時生成的讀視圖,在該事務執行快照讀的那一刻,系統會生成一個快照,記錄此時事務的id,用來做可見性判斷的,判斷當前事務能夠看到哪個版本的數據,有可能讀取到的是最新的數據,也有可能讀取到的是當前記錄的undolog中某個版本的數據。
?總結:
-
在MVCC中,每個數據行都會維護多個版本。每當對一行數據進行更新操作時,都會生成新的版本。每個版本都有一個時間戳,用于標識該版本的創建時間。
-
在讀取數據時,事務只能看到創建時間早于事務開始時間的版本。
-
當寫操作時,會生成新的版本并更新到數據行中。舊的版本仍然存在,不會被刪除。以便正在進行的其他事務可以繼續讀取到舊的版本,不會被阻塞。
-
MVCC版本控制機制維護了數據的一致性和隔離性。事務開始時,會記錄當前的最新版本號。在事務執行過程中,只能讀取到小于事務開始時的版本,保證讀取的數據在事務開始時是一致的?。
?
?系列文章索引
MyBatis的插件能在哪些地方進行攔截?
了解MyBatis的緩存機制嗎
面試官:談談對volatile的理解
Spring中用到了哪些設計模式
面試官:說一下SQL的執行過程
線程池的工作原理
?