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。


  • 相关阅读:
    mac 10.15.7 修改PATH
    oc 属性类型一般用法
    ubuntu解压zip文件名乱码
    telnet 退出
    docker 根据容器创建镜像
    mac android adb device 没有显示设备
    Yii2 查看所有的别名 alias
    Yii2 App Advanced 添加 .gitignore
    ubuntu 18.04 搜狗突然就提示乱码
    An error occured while deploying the file. This probably means that the app contains ARM native code and your Genymotion device cannot run ARM instructions. You should either build your native code to
  • 原文地址:https://www.cnblogs.com/zhjh256/p/15438198.html
Copyright © 2011-2022 走看看