前言
阅读之前,您可能需要了解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