下面可以乘凉的不一定是大树,但大树底下一定是可以乘凉的。
RSS icon
  • 

    PostGreSQL之MVCC代码分析(1):概览

    发表于 九月 21st, 2009 大树 1 comment

    PostGreSQL采用“快照”方式来实现MVCC。具体地说,这意味着每一个事务中的查询仅能看到:

    1.该事务启动之前已经提交的事务所作出的数据更改。
    2.当前事务中该查询之前的查询所作出的更改。

    PostGreSQL在每个事务启动时为该事务获取一个当前的数据库快照,快照中数据结构如下:

    typedef struct SnapshotData
    {
        SnapshotSatisfiesFunc satisfies;    /*行测试函数指针*/

        TransactionId xmin;            /* id小于xmin的所有事务更改在当前快照中可见 */
        TransactionId xmax;            /* id大于xmax的所有事务更改在当前快照中可见 */
        uint32        xcnt;            /* 正在运行的事务的计数 */
        TransactionId *xip;            /* 所有正在运行的事务的id列表 */

        /* note: all ids in xip[] satisfy xmin <= xip[i] < xmax */
        int32        subxcnt;        /* # of xact ids in subxip[], -1 if overflow */

        TransactionId *subxip;        /* array of subxact IDs in progress */
        CommandId    curcid;            /* in my xact, CID < curcid are visible */
        uint32        active_count;    /* refcount on ActiveSnapshot stack */
        uint32        regd_count;        /* refcount on RegisteredSnapshotList */
        bool        copied;            /* false if it’s a static snapshot */
    } SnapshotData;

     

    Transaction启动时形成快照就是要记录该Transaction可见的TransactionID,排除不可见的ID。PostGreSQL中每一个版本的数据有两个ID,其中一个是CreationID即插入该数据的TransactionID,一个是ExpiredID,即删除或更新该数据的TransactionID。对一个Transaction可见的数据的ID要满足以下条件:
                1.CreationID<当前TransactionID
                2.ExpiredID>当前TransactionID或ExpiredID不存在

    Transaction启动形成快照的过程:
    遍历当前所有活动的Transaction,记录在一个活动Transaction的ID数组中;根据Transaction的先后顺序,选择当前Transaction可见的最小TransactionID,记录在xmin,选择可见的最大TransactionID,记录在xmax中。

     

    PostGreSQL8.5中进行最终的版本选择是在从外存中获取一个页面的数据之后,由一个检验函数(HeapTupleSatisfiesMVCC等一系列函数)检验所有该页面数据的数据对当前Transaction的可见性,如果不可见,则将数据除去,最后返回所有可见数据。

    您来到小站很多次了哦,喜欢的话,不妨订阅我吧·!

    相关文章:

    1. C#中dllimport用法 dllimport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息。 dllimport属性应用于方法,要求最少要提供包含入口点的dll的名称。 [AttributeUsage(AttributeTargets.Method)]   public class DllImportAttribute: System.Attribute   {    public DllImportAttribute(string dllName) {...} //定位参数为dllName    public CallingConvention...
    2. PostGreSQL之MVCC分析终结篇 从9月中旬开始的PostGreSQL代码阅读+MVCC,至今总算告一段落。此次分析,既有意料之中,亦有出乎意料。意料之中的是过程复杂曲折,意料之外的是PostGreSQL的MVCC实现居然如此简单。...
    3. [转]Java util之常用数据类型特性盘点 java.util就相当于c++的STL,是Java的一个非常重要的包,有很多常用的数据类型,不同数据类型有不同的用途,而有些数据类似乎很相似,怎样选择应用,就需要对它们进行辨析。 下面列出了这些数据类型的特点,根据这些特点,就可以有针对性的选用 ...
    4. 数据库基准测试知识收集–基础概念篇 TPC:事务处理性能测试委员会TPC(Transaction process performance Council)是一个专门负责制定计算机事务处理能力测试标准并监督其执行的组织,其总部位于美国。其功能是制定商务应用基准程序(Benchmark)的标准规范、性能和价格度量,并管理测试结果的发布。目前,TPC已经制定了众多标准,其中包括已过期的TPC-A,TPC-B,TPC-D,TPC-R,TPC-W标准和正在使用的TPC-C,TPC-E,TPC-H和TPC-APP标准。 OLTP:联机事务处理。也称为面向交易的处理系统,其基本特征是顾客的原始数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果。这样做的最大优点是可以即时地处理输入的数据,及时地回答。也称为实时系统(Real time System)。衡量联机事务处理系统的一个重要性能指标是系统性能,具体体现为实时响应时间(Response Time),即用户在终端上送入数据之后,到计算机对这个请求给出答复所需要的时间。OLTP 数据库旨在使事务应用程序仅写入所需的数据,以便尽快处理单个事务。   ...

    

    1 Trackbacks / Pingbacks

    乘凉说话