zoukankan      html  css  js  c++  java
  • postgresql xact

    xact就是事务,只不过有些地方用xact,有些地方用trans,有些用transaction。

    从内部看,事务状态分为:

    /*
    * transaction states - transaction state from server perspective
    */
    typedef enum TransState
    {
    TRANS_DEFAULT, /* idle */
    TRANS_START, /* transaction starting */
    TRANS_INPROGRESS, /* inside a valid transaction */
    TRANS_COMMIT, /* commit in progress */
    TRANS_ABORT, /* abort in progress */
    TRANS_PREPARE /* prepare in progress */
    } TransState;

    从用户角度看,事务状态分为:
    /*
     *    transaction block states - transaction state of client queries
     *
     * Note: the subtransaction states are used only for non-topmost
     * transactions; the others appear only in the topmost transaction.
     */
    typedef enum TBlockState
    {
        /* not-in-transaction-block states */
        TBLOCK_DEFAULT,                /* idle */
        TBLOCK_STARTED,                /* running single-query transaction */
    
        /* transaction block states */
        TBLOCK_BEGIN,                /* starting transaction block */
        TBLOCK_INPROGRESS,            /* live transaction */
        TBLOCK_IMPLICIT_INPROGRESS, /* live transaction after implicit BEGIN */
        TBLOCK_PARALLEL_INPROGRESS, /* live transaction inside parallel worker */
        TBLOCK_END,                    /* COMMIT received */
        TBLOCK_ABORT,                /* failed xact, awaiting ROLLBACK */
        TBLOCK_ABORT_END,            /* failed xact, ROLLBACK received */
        TBLOCK_ABORT_PENDING,        /* live xact, ROLLBACK received */
        TBLOCK_PREPARE,                /* live xact, PREPARE received */
    
        /* subtransaction states */
        TBLOCK_SUBBEGIN,            /* starting a subtransaction */
        TBLOCK_SUBINPROGRESS,        /* live subtransaction */
        TBLOCK_SUBRELEASE,            /* RELEASE received */
        TBLOCK_SUBCOMMIT,            /* COMMIT received while TBLOCK_SUBINPROGRESS */
        TBLOCK_SUBABORT,            /* failed subxact, awaiting ROLLBACK */
        TBLOCK_SUBABORT_END,        /* failed subxact, ROLLBACK received */
        TBLOCK_SUBABORT_PENDING,    /* live subxact, ROLLBACK received */
        TBLOCK_SUBRESTART,            /* live subxact, ROLLBACK TO received */
        TBLOCK_SUBABORT_RESTART        /* failed subxact, ROLLBACK TO received */
    } TBlockState;

    默认都是空闲,由全局变量TopTransactionStateData定义:

    /*
     * CurrentTransactionState always points to the current transaction state
     * block.  It will point to TopTransactionStateData when not in a
     * transaction at all, or when in a top-level transaction.
     */
    static TransactionStateData TopTransactionStateData = {
        .state = TRANS_DEFAULT,
        .blockState = TBLOCK_DEFAULT,
    };
    
    static TransactionState CurrentTransactionState = &TopTransactionStateData;

    PS:在PG中,事务是支持超时的(还有其他很多逻辑比如死锁检测)。超时包括下列类型:

    /*
     * Identifiers for timeout reasons.  Note that in case multiple timeouts
     * trigger at the same time, they are serviced in the order of this enum.
     */
    typedef enum TimeoutId
    {
        /* Predefined timeout reasons */
        STARTUP_PACKET_TIMEOUT,
        DEADLOCK_TIMEOUT,
        LOCK_TIMEOUT,
        STATEMENT_TIMEOUT,
        STANDBY_DEADLOCK_TIMEOUT,
        STANDBY_TIMEOUT,
        STANDBY_LOCK_TIMEOUT,
        IDLE_IN_TRANSACTION_SESSION_TIMEOUT,
        /* First user-definable timeout reason */
        USER_TIMEOUT,
        /* Maximum number of timeout reasons */
        MAX_TIMEOUTS = 16
    } TimeoutId;

    好奇一下,超时是什么机制做的?是基于SIGALRM信号触发的,超时管理实现在src/backend/utils/misc/timeout.c中,超时后是可以回调函数的。前3个事务ID保留:

    #define InvalidTransactionId   ((TransactionId) 0)
    #define BootstrapTransactionId ((TransactionId) 1)
    #define FrozenTransactionId ((TransactionId) 2)
    #define FirstNormalTransactionId ((TransactionId) 3)
    #define MaxTransactionId ((TransactionId) 0xFFFFFFFF)

    事务ID包括:
    LocalTransactionId:进程本地计数器生成,主要是为了优化。
    VirtualTransactionId:分为两部分,前半部分为BackendId,后半部分为LocalTransactionId。
    TransactionId/MultiXactId:主要是非专用区别场景使用,就是不需要明显区分,不需要特别的区分上下文。
    SubTransactionId:子事务ID。


  • 相关阅读:
    暑假工作日志——关于51的串口的小问题
    C中怎么利用指针实现一个函数输入一个数组且输出一个数组
    2015.8.5数组与指针练习总结
    2015.8.5关于指针的个人理解
    2015.8.3keil调试遇到的问题
    2015.8.3stm32f4串口调试记录
    quartusII 错误记录
    3/4、事例三、四:透视投影(Perspective)、正射投影(Ortho)
    2、事例二: 三角形的几何变换平移(Translate)、旋转(Scale)、缩放(Rotate)
    1、事例一: 一个三角形、一个正方形(Vertex)
  • 原文地址:https://www.cnblogs.com/zhjh256/p/15438198.html
Copyright © 2011-2022 走看看