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