問題
數據庫MVCC是什么
我的回答
MVCC,全稱是"多版本并發控制"(Multi-Version Concurrency Control),是數據庫管理系統中常用的一種并發控制技術。說白了,它就是通過維護數據的多個版本,讓讀操作不會被寫操作阻塞,從而提高并發性能。
我覺得理解MVCC最好從它要解決的問題入手。在傳統的加鎖并發控制中,讀會阻塞寫,寫也會阻塞讀,這樣并發性能就很差。MVCC巧妙地解決了這個問題,它的核心思想是:讀不阻塞寫,寫也不阻塞讀,每個事務看到的都是特定時間點的數據快照。
具體實現上,以MySQL的InnoDB為例,它是這樣做的:
首先,InnoDB給每行數據都增加了兩個隱藏字段:創建版本號(DB_TRX_ID)和刪除版本號(DB_ROLL_PTR)。當事務開始時,會分配一個遞增的事務ID。
當事務對數據進行修改時,實際上不會直接修改原數據,而是創建一個新版本,并用老版本構建一個回滾指針,形成一個版本鏈。原來的數據并不會立即刪除,而是標記一個刪除版本號。
讀操作時,MVCC會根據事務隔離級別和事務ID,從版本鏈中選擇合適的版本來讀取。比如在"可重復讀"隔離級別下,事務只能讀到事務開始前已經提交的數據,以及自己修改但還未提交的數據。
這樣設計的好處是顯而易見的:讀寫不沖突,大大提高了并發性能;同時還能實現不同的事務隔離級別,比如"讀已提交"、"可重復讀"等。
當然,MVCC也有缺點,比如需要額外的存儲空間來保存多版本數據,以及定期清理過期版本的開銷。但總體來說,它是一種非常優秀的并發控制技術,被MySQL、PostgreSQL等主流數據庫廣泛采用。