oracle判断字段为空时选用别的字段_PostgreSQL多版本的可见性判断

本文介绍了PostgreSQL中tuple行头信息、事务状态和可见性判断规则,详细阐述了如何根据事务快照判断数据行的可见性,以及在不同事务状态下对可见性的影响。总结了Oracle与PostgreSQL在事务可见性上的相似之处。
摘要由CSDN通过智能技术生成

前言

阅读之前,您可能需要了解MVCC和事务快照相关文章。

文章目录

一、tuple行头信息简介

二、PostgreSQL事务状态

三、tuple可见性判断规则

四、归纳总结

一、tuple行头信息简介

tuple行头简述

前面的文章中,介绍过pg中通过事务id来标记一个数据行的版本,即之前我们提及的t_xmin、t_xmax。

tuple头部信息记录着数据行的t_xmin、t_xmax、t_cid、t_xvac等信息。在可见性判断里面比较重要的是:

t_xmin:表示tuple的插入事务id。

t_xmax:表示tuple的被删除或被锁住的事务id。

typedef struct HeapTupleFields{
      TransactionId t_xmin;    /* inserting xact ID */  TransactionId t_xmax;    /* deleting or locking xact ID */  union  {
        CommandId  t_cid;    /* inserting or deleting command ID, or both */    TransactionId t_xvac;  /* old-style VACUUM FULL xact ID */  }      t_field3;} HeapTupleFields;详见:postgresql-12.2\src\include\access\htup_details.h

二、Postgresql事务状态

1.事务状态和可见性判断关系

当我们在事务中发起一个SQL语句查询数据的时候,表记录tuple某个版本对当前事务是否可见,是在特定的事务快照下,通过读取tuple的xid事务状态信息来进行判断的。

2.事务提交日志clog

PostgreSQL 中定义的事务状态有四种:

1).处理中:in progress

2).已提交:committed

3).异常终止:aborted

4).子事务已提交:sub committed

以上事务状态会持久化到 $PGDATA/pg_xact目录下clog文件。同时,为了减少对clog的IO请求,会cache部分事务状态到shared_buffers中,并且在tuple的t_infomask字段标记相关的事务状态。

/* * Possible transaction statuses --- note that all-zeroes is the initial * state. * * A "subcommitted" transaction is a committed subtransaction whose parent * hasn't committed or aborted yet. */typedef int XidStatus;#define TRANSACTION_STATUS_IN_PROGRESS    0x00#defi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值