• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PostgreSQL数据库事务实现方法分析

    本文实例讲述了PostgreSQL数据库事务实现方法。分享给大家供大家参考,具体如下:

    事务简介

    事务是所有数据库系统的一个基本概念。 一次事务的要点就是它把多个步骤捆绑成了一个单一的,不成功则成仁的操作。 其它并发的事务是看不到在这些步骤之间的中间状态的,并且如果发生了一些问题, 导致该事务无法完成,那么所有这些步骤都完全不会影响数据库。PostgreSQL为每条事务创建一个postgre进程,并发执行事务。采用分层的机制执行事务,上层事务块和底层事务。上层事务块是用户眼中的事务,用于控制事务执行的状态;底层事务是事务中的每条语句,可以改变上层事务块的状态。

    上层事务块

    每个postgre进程只有一个事务块,上层事务块记录着本次事务执行过程中的各个状态。

    typedef enum TBlockState
    {
      /* not-in-transaction-block states */
      TBLOCK_DEFAULT,       /* idle */
      TBLOCK_STARTED,       /* 执行简单查询事务 */
      /* transaction block states */
      TBLOCK_BEGIN,        /* 遇见事务开始BEGIN */
      TBLOCK_INPROGRESS,     /* 事务正在执行中 */
      TBLOCK_PARALLEL_INPROGRESS, /* live transaction inside parallel worker */
      TBLOCK_END,         /* 遇见事务结束COMMIT/END的时候设置 */
      TBLOCK_ABORT,        /* 事务出错,等待ROLLBACK */
      TBLOCK_ABORT_END,      /* 事务出错,收到ROLLBACK */
      TBLOCK_ABORT_PENDING,    /* 事务处理中,接收到ROLLBACK */
      TBLOCK_PREPARE,       /* 事务处理中,收到PREPARE(分布式事务) */
      /* 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;
    
    

    常见的事务块状态转换图

     

    底层事务

    底层事务是需要执行的每条命令,负责处理资源和锁的获取和释放,信号的处理,日志记录等等

    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;
    
    

    主要有四个函数:

    分布式事务

    PostgreSQL提供了分布式事务中的,两阶段提交的接口

    并发控制

    PostgreSQL采用MVCC的方式进行并发控制,每个事务看到的是一段时间前的数据快照。同时,MVCC并不能够解决所有问题,所以也提供了行级和表级的锁。

    标准的事务隔离级别有4个,而PostgreSQL只实现了读已提交和可串行化。

    PostgreSQL实现了8种锁(可怕)

     

    太多了,就记住几个吧。

    加锁的对象

    死锁处理

     

    MVCC

    关键词:

    typedef struct HeapTupleFields
    {
      TransactionId t_xmin;    /* Insert,Update事务 */
      TransactionId t_xmax;    /* Delete,Update,Row Locks事务ID */
      union
      {
        CommandId  t_cid;   /* 操作ID */
        TransactionId t_xvac;  /* old-style VACUUM FULL xact ID */
      }      t_field3;
    } HeapTupleFields;
    
    

    cmin:插入该元组的命令在插入事务中的命令标识(从0开始累加)
    cmax:删除该元组的命令在插入事务中的命令标识(从0开始累加)
    ctid:相当于rowid , 数据块ID,偏移量>
    XID:事务ID
    Xid_snapshot:当前系统中未提交的事务
    CLOG:事务状态日志(已提交的日志)

    隔离级别

    1. RC:读已提交
      1. 两个事务可以并发更新同一行
      2. 一个事务更新,一个事务删除同一行,删除操作会上锁
    2. RR:读未提交,其实是snapshot isolation,(冲突状态会回滚)
    3. 可串行化:serialize snapshot isolation,比标准可串行化要高,通过加内存中的意向锁实现,不允许预加锁的数据被其他事务变更

    数据可见性判断

    1. 记录的头部XID信息比当前事务更早(rr和ssi有这个要求,read commited没有这个要求,读已经提交可以读未来的事务!!)
    2. 记录头部的XID信息不在当前的XID_snapshot中,(记录上的事务状态不是未提交的事务)
    3. 记录头部的XID信息在CLOG中代表已提交。

    多行数据需要过期版本回收

    1. 页面级:页面访问时回收
    2. 表级/系统级: autovacuum; vacuum

    日志

    1. pg_log:数据库活动日志(也就是数据库的操作日志);
    2. pg_xlog:事务日志,记录事务的执行过程,redo日志
    3. pg_clog:事务状态日志(pg_clog是pg_xlog的辅助日志),记录事务的结果。

    希望本文所述对大家PostgreSQL数据库程序设计有所帮助。

    您可能感兴趣的文章:
    • 用PostgreSQL数据库做地理位置app应用
    • Python实现连接postgresql数据库的方法分析
    • C# 操作PostgreSQL 数据库的示例代码
    • 在Ubuntu中安装Postgresql数据库的步骤详解
    • 详解PostgreSql数据库对象信息及应用
    上一篇:PostgreSQL存储过程用法实战详解
    下一篇:PostgreSQL实现交叉表(行列转换)的5种方法示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    PostgreSQL数据库事务实现方法分析 PostgreSQL,数据库,事务,实现,