PostgreSQL 多版本併發控制MVCC

2021-09-12 09:52:49 字數 680 閱讀 6746

什麼是mvcc?

mvcc,multi-version concurrency control,多版本併發控制,mvcc就是用同乙份資料臨時保留多版本的方式,實現併發控制。它可以避免讀寫事務之間的互相阻塞,相比通常的封鎖技術可極大的提高業務的併發效能。

如果有人從資料庫中讀資料的同時,有另外的人寫入資料,有可能讀資料的人會看到『半寫』或者不一致的資料。有很多種方法來解決這個問題,叫做併發控制方法。最簡單的方法,通過加鎖,讓所有的讀者等待寫者工作完成,但是這樣效率會很差。mvcc 使用了一種不同的手段,每個連線到資料庫的讀者,在某個瞬間看到的是資料庫的乙個快照,寫者寫操作造成的變化在寫操作完成之前(或者資料庫事務提交之前)對於其他的讀者來說是不可見的。

當乙個 mvcc 資料庫需要更新一條資料記錄的時候,它不會直接用新資料覆蓋舊資料,而是將舊資料標記為過時,並在別處增加新版本的資料。這樣就會有儲存多個版本的資料,但是只有乙個是最新的。這種方式允許讀者讀取在他讀之前已經存在的資料,即使這些在讀的過程中半路被別人修改、刪除了,也對先前正在讀的使用者沒有影響。這種多版本的方式為了避免填充刪除操作在記憶體和磁碟儲存結構造成的空洞的開銷,需要系統週期性整理以真實刪除老的、過時的資料。

mvcc實現原理

資料檔案中存放同一邏輯行的多個行版本(稱為tuple);

每個行版本的頭部記錄建立該版本的事務id以及刪除該行版本的事務的id(分別稱為xmin和xmax);

PostgreSQL中的多版本併發控制

多版本併發控制的原理 在併發操作中,當正在寫時,如果使用者在讀,可能會產生資料不一致的問題。比如一行的前半部分剛寫入,後半部分還沒有寫入,這時讀的人可能讀取到的資料行,其前半部分資料是新的,後半部分資料是舊的,這樣就導致了資料一致性問題。解決這個問題最簡單的辦法是使用讀寫鎖。寫的時候,不允許讀,正在...

多版本併發控制

多版本併發控制,討論的不是指的乙個軟體同時發行多個版本怎麼進行管理的問題,而是mysql中的mvcc。mvcc,multiple version concurrent control,多版本併發控制。可以認為mvcc是行級鎖的乙個變種,但它在很多情況下避免了加鎖操作,因此開銷更低。雖然實現機制有所不...

MySQL InnoDB MVCC多版本併發控制

multiversion concurrency control 1.先引用 高效能mysql 中對mvcc的部分介紹 2.可以了解到 3.另外,高效能mysql 中提到,innodb的mvcc是通過在每行記錄後面儲存兩個隱藏的列來實現的.這個貌似和網上很多觀點不同,具體可以參考mysql官方對in...