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

    --

  • 相关阅读:
    C# 串口通信总结
    配置文件的读写
    配置文件入门
    锁机制与原子操作 <第四篇>
    线程池 异步I/O线程 <第三篇>
    线程池之ThreadPool类与辅助线程
    这一篇sigmoid和softmax的比较,讲的不错
    今天看到的关于深度学习的一篇文章,可以好好学习下
    git各种命令 & git merge和git rebase的区别
    ORA-19815,ORA-19809 :limit exceeded for recovery files
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3174519.html
Copyright © 2011-2022 走看看