2024-09-03
本文主要介紹AntDB數據庫內核中的一個很重要的機製——MVCC機製。
MVCC簡介
MVCC(多版本並發控製)是AntDB數據庫中實現事務隔離級別的一種機製。它允許多個事務同時對數據進行讀寫和修改操作,而不會相互幹擾。在MVCC中,每個數據庫事務在讀取數據時會看到一個特定的版本,這使得事務之間可以同時進行讀寫操作,而不會相互沖突。每個事務可以操作自己的數據版本,從而實現了更高的並發性和更好的性能。
MVCC的核心思想是,對於每個修改操作,不是直接在原始數據上進行修改,而是創建一個新的數據版本,並將修改操作應用於新版本。這樣,其他事務仍然可以訪問舊版本的數據,而不會受到正在進行的修改的影響。只有在事務提交時,新版本的數據才會替代舊版本,從而實現數據的一致性。
MVCC實現原理
1、隱藏字段
了解MVCC之前,需要先介紹一下數據庫內核中幾個隱藏的字段,MVCC機製通過這些隱藏的標記字段來協同實現。
oid: 對象標識符,生成的值是全局唯一的,表、索引、視圖都帶有oid
ctid: 每條記錄(稱為一個tuple)在表中的物理位置標識。
xmin: 創建一條記錄(tuple)時,記錄此值為當前事務ID。
xmax: 創建tuple時,默認為0,刪除tuple時,記錄此值為當前事務ID。
cmin/cmax: 標識在同一個事務中多個語句命令的序列值,從0開始,用於同一個事務中實現版本可見性判斷
2、數據版本
在AntDB中,每個數據項都包含一個唯一的版本號,稱為xmin。每個數據項還包含一個刪除版本號,稱為xmax。這些版本號用於記錄行版本的創建和刪除事務。當一個事務讀取或修改數據時,它將在內存中創建一個新的數據版本,並分配一個唯一的版本號。這個版本號將與事務ID相關聯,用於跟蹤事務對數據的修改。
3、事務狀態
每個事務都有一個唯一的事務ID,稱為xid。事務ID用於標識事務的狀態。當事務開始時,它將分配一個唯一的事務ID,並將其記錄在事務狀態日誌文件中,事務狀態日誌文件用於記錄事務的狀態信息。通過事務狀態日誌文件,AntDB可以跟蹤每個事務的狀態,並根據事務ID選擇適當的數據版本。
4、並發控製
在並發控製中,AntDB使用了一種稱為「讀-寫偏斜」的技術。這種技術的基本思想是:當一個事務正在修改數據時,其他事務不能同時讀取或修改該數據。通過限製並發事務對數據的訪問,AntDB可以避免讀寫沖突。
當一個事務需要讀取數據時,AntDB會檢查該數據的最新版本號(即xmax)。如果最新版本號等於當前事務的事務ID,則表示該數據正在被修改,當前事務不能讀取該數據。如果最新版本號小於當前事務的事務ID,則表示該數據已經提交,當前事務可以讀取該數據。如果最新版本號介於兩個事務ID之間,則表示該數據處於中間狀態,當前事務需要等待該數據變為可用狀態後再進行讀取。
當一個事務需要修改數據時,AntDB會將新數據版本寫入磁盤,並將新版本的事務ID更新到事務狀態日誌文件中。其他事務在讀取數據時,將檢查該數據的事務ID是否與它們的事務ID相同。如果相同,則讀取該版本的數據;如果不同,則讀取更高版本的數據。通過這種方式,AntDB實現了並發控製,避免了讀寫沖突。
5、可見性判定
在並發控製中,可見性判定是一個重要的環節。它用於確定一個事務能否看到另一個事務提交的數據。在AntDB中,可見性判定是通過檢查事務ID來實現的。如果一個事務的提交順序在另一個事務之後,那麽前一個事務就可以看到後一個事務提交的數據。反之,如果一個事務的提交順序在前一個事務之前,那麽前一個事務就看不到後一個事務提交的數據。通過這種方式,AntDB實現了可見性的判定。
MVCC的優點
並發優化
讀寫不會相互阻塞,寫操作並沒有堵塞其他事務的讀,在寫事務未提交前,讀取的都是之前的版本,提高了並發的訪問效率。
快速回滾
事務可以快速回滾,操作後的tuple都帶有當前事務ID,直接標記事務狀態日誌文件中對應事務的狀態就可達到回滾的目的。
MVCC的缺點
索引維護消耗
當對表執行 UPDATE 查詢時,數據庫還必須更新該表的所有索引以將條目添加到新版本。這些索引更新增加了內存壓力和磁盤 I/O,特別是對於具有大量索引的表,隨著表中索引數量的增加,更新元組時產生的開銷也會增加。
事務回卷問題
事務ID回卷問題會影響到事務的並發訪問和提交順序,可能會導致死鎖和幻像讀等問題。具體來說,當新的事務ID回卷到舊的事務ID時,可能會導致舊的事務無法正常提交,因為新的事務會覆蓋舊的事務的數據版本。
垃圾數據問題
根據MVCC機製,更新和刪除的記錄都不會被實際刪除,操作頻繁的表會積累大量的過期數據,占用磁盤空間,當掃描查詢數據時,需要更多的IO,降低查詢效率。但是可以通過vacuum命令操作來清理過期的數據。
小結
在本文中,我們詳細介紹了MVCC(多版本並發控製)機製的工作原理、優點和缺點,以及它對數據庫事務和並發訪問的影響。MVCC是一種強大的並發控製機製,它允許多個事務同時進行讀寫操作,提高了數據庫的並發性和性能,並解決了傳統鎖定機製可能帶來的性能問題和並發沖突。
然而,它也存在一些缺點,所以在使用時需要註意優化。
關於亞信安慧AntDB數據庫
AntDB數據庫始於2008年,在運營商的核心系統上,服務國內24個省市自治區的數億用戶,具備高性能、彈性擴展、高可靠等產品特性,峰值每秒可處理百萬筆通信核心交易,保障系統持續穩定運行超十年,並在通信、金融、交通、能源、物聯網等行業成功商用落地。