MVCC的一種實現方案

weixin_34037977發表於2013-07-05

源資訊來源:http://my.oschina.net/juliashine/blog/111624

--

簡單描述:

一個data-server,通過mvcc來實現事務的一致性,已支援更高的吞吐和更低的lantency。

--

每個Transaction(簡稱Trx)分配一個版本XID。XID是全域性維護的遞增ID。

每個Data Item(相當於DB table的一行),有兩個標記分別是XMIN和XMAX。表示此資料項在XMIN時建立,在XMAX刪除,如果XMAX未賦值,則表示建立以來還沒刪除。

Server維護一個當前所有未提交的XID列表。

--

更新操作insert、delete、modify的流程:

insert時,將自己的事務XID賦值給資料項的XMIN,XMAX賦值為無值。

delete時,將自己的事務XID賦值給資料項的XMAX。

modify時,通過delete+insert來模擬,也就是將自己的XID賦值給當前資料項的XMAX,然後新增一個新的資料項,賦值其XMIN為XID,並賦值XMAX為無值。

--

查詢操作流程:

如果資料項的XMIN小於等於當前事務的XID,XMAX為無值或者是大於XID或者在未提及事務列表XID集合中,則此資料項可見。

--

如上顯然會存在較多的廢棄資料,如何移除這些資料需要特別考慮。

移除不可見資料兩種方法,分別在postgreSQL和Oracle使用了。

方法1. postgreSQL 

所有版本的data item都存在同一個key-value空間,對版本數量不限制。通過一個後臺程式來回收老版本的資料。回收計劃可以在讀、寫時觸發,或者定期排程。


方法2. oracle、innodb

主key-value空間只儲存最新的版本,之前的版本儲存在另一個地方,且儲存老版本的空間大小固定。最新的版本會指向老版本,可以由此上溯到之前的任意版本。由於空間固定,太早的版本會被移除。某個事物可能因為找不到指定版本的資料而失敗。

--

 

相關文章