MVCC的一种实现方案

源信息来源: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空间只存储最新的版本,之前的版本存储在另一个地方,且存储老版本的空间大小固定。最新的版本会指向老版本,可以由此上溯到之前的任意版本。由于空间固定,太早的版本会被移除。某个事物可能因为找不到指定版本的数据而失败。

--

原文地址:https://www.cnblogs.com/snake-hand/p/3174519.html