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