PostgreSQL vacuum可见性

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: PostgreSQL vacuum可见性

分两种情况,一是XMIN事务未提交,一个是xmin事务已提交。

针对xmin未提交的事务,即当前的tupleinsert还未提交:

1)元组不合法,即坏元组时,返回HEAPTUPLE_DEAD

2)该tuple是当前事务产生的:此时这个记录在这个事务未删除或只是被锁住或进行了delete但是delete abort了,那返回HAPTUPLE_INSERT_IN_PROGRESS;若则记录又被删除了,那返回HEAPTUPLE_DELETE_IN_PROGRESS

3)该tuple是其他事务产生的,tuple头中标记未提交:HEAP_INSERT_IN_POGRESS

4)该tuple是其他事务产生,clog中显示xmin已提交:则标记tuple头为HEAP_XMIN_COMMITTED

5)其他情况下,这个xmin事务确实未提交,abort或损坏了:返回HEAPTUPLE_DEAD

针对xmin已提交的事务,即当前的tuple insert已提交了:

1xmax未提交,返回HEAPTUPLE_LIVE

2tuple只是被锁着:xmax未提交:返回HEAPTUPLE_LIVE

3tuple正在delete:返回HEAPTUPLE_DELETE_IN_PROGRESS

4clog中查到xmax已提交:标记tupleHEAP_XMAX_COMMITTED

5)其他情况delete确实未提交:HEAPTUPLE_LIVE

6)剩下的情况,tuple.t_xmax >= OldestXmin表示有事务还能看到insert的值:HEAPTUPLE_RECENTLY_DEAD

7)其他情况XMAX已提交了:返回HEAPTUPLE_DEAD

函数为:HeapTupleSatisfiesVacuum



HeapTupleSatisfiesVacuum
{
  HeapTupleHeader tuple = htup->t_data;
  if (!HeapTupleHeaderXminCommitted(tuple))//未提交
  {
    if (HeapTupleHeaderXminInvalid(tuple))//元组不合法,坏的元组
      return HEAPTUPLE_DEAD;
    else if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetRawXmin(tuple)))
    {//当前事务产生的元组
      if (tuple->t_infomask & HEAP_XMAX_INVALID)//未被删除,当前事务正在insert
        return HEAPTUPLE_INSERT_IN_PROGRESS;
      //元组被锁住,未被删除 或者 
      if (HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask) || HeapTupleHeaderIsOnlyLocked(tuple))
        return HEAPTUPLE_INSERT_IN_PROGRESS;
      //insert后当前事务又删除
      if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetUpdateXid(tuple)))
        return HEAPTUPLE_DELETE_IN_PROGRESS;
      //delete的子事务被abort,即insert正在进行
      return HEAPTUPLE_INSERT_IN_PROGRESS;
    }
    else if (TransactionIdIsInProgress(HeapTupleHeaderGetRawXmin(tuple)))
    {//其他事务正在insert
      return HEAPTUPLE_INSERT_IN_PROGRESS;
    }//从clog中读取tuple的事务状态,为提交则标记提交
    else if (TransactionIdDidCommit(HeapTupleHeaderGetRawXmin(tuple)))
      SetHintBits(tuple, buffer, HEAP_XMIN_COMMITTED,HeapTupleHeaderGetRawXmin(tuple));
    else
    {
      //真的tuple未提交、abort或者损坏
      SetHintBits(tuple, buffer, HEAP_XMIN_INVALID,InvalidTransactionId);
      return HEAPTUPLE_DEAD;
    }
    //此时,xmin已提交了。
  }
  /*
   * Okay, the inserter committed, so it was good at some point.  Now what
   * about the deleting transaction?
   */
  if (tuple->t_infomask & HEAP_XMAX_INVALID)
    return HEAPTUPLE_LIVE;//未被删除则该记录是活的
  if (HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask))
  {//只是锁住,未进行delete
    if (!(tuple->t_infomask & HEAP_XMAX_COMMITTED))
    {//delete事务未提交
      if (TransactionIdIsInProgress(HeapTupleHeaderGetRawXmax(tuple)))
        return HEAPTUPLE_LIVE;
      SetHintBits(tuple, buffer, HEAP_XMAX_INVALID,InvalidTransactionId);
    }
    return HEAPTUPLE_LIVE;
  }
  //delete未提交
  if (!(tuple->t_infomask & HEAP_XMAX_COMMITTED))
  {
    if (TransactionIdIsInProgress(HeapTupleHeaderGetRawXmax(tuple)))
      return HEAPTUPLE_DELETE_IN_PROGRESS;//delete正在进行
    else if (TransactionIdDidCommit(HeapTupleHeaderGetRawXmax(tuple)))//从clog中检查delete提交了
      SetHintBits(tuple, buffer, HEAP_XMAX_COMMITTED,HeapTupleHeaderGetRawXmax(tuple));
    else
    {
      //真的未提交、abort或者损坏
      SetHintBits(tuple, buffer, HEAP_XMAX_INVALID,InvalidTransactionId);
      return HEAPTUPLE_LIVE;
    }
    //此时delete已提交
  }
  //有事务还可能看到他
  //tuple->t_choice.t_heap.t_xmax >= OldestXmin
  if (!TransactionIdPrecedes(HeapTupleHeaderGetRawXmax(tuple), OldestXmin))
    return HEAPTUPLE_RECENTLY_DEAD;
  /* Otherwise, it's dead and removable */
  return HEAPTUPLE_DEAD;
}


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
3月前
|
缓存 运维 监控
PostgreSQL运维技巧之vacuum调优
PostgreSQL运维技巧之vacuum调优
238 3
|
关系型数据库 分布式数据库 PolarDB
|
关系型数据库 分布式数据库 定位技术
PolarDB for PostgreSQL 开源必读手册-VACUUM处理(中)
PolarDB for PostgreSQL 开源必读手册-VACUUM处理
159 0
|
关系型数据库 定位技术 数据库
PostgreSQL技术大讲堂 - 第17讲:Vacuum空间管理工具
PostgreSQL从小白到专家,技术大讲堂 - 第17讲:Vacuum空间管理工具
191 0
|
关系型数据库 分布式数据库 数据库
PolarDB for PostgreSQL 开源必读手册-VACUUM处理(下)
PolarDB for PostgreSQL 开源必读手册-VACUUM处理
164 0
|
存储 SQL Oracle
再谈PostgreSQL的膨胀和vacuum机制及最佳实践
作者介绍 朱贤文,成都文武信息技术有限公司创始人,PostgreSQL中国用户会核心组成员,熟悉数据库,存储和集群技术; 成都文武信息技术有限公司是PostgreSQL和GreenPlum数据库服务的专业厂商,主要产品是ECOX集群管理系统和Hunghu Cloud,专门运行数据库的私有云系统,带高端存储功能。公司总部位于天府软件园。公司网站:w3.ww-it.cn 写本文的原因 这两天有两篇专门介绍PostgreSQL的vacuum机制的技术文章,得到了比较热烈和正面的反馈,让用户可以比较清楚地理解和使用这个特性。 我个人觉得有点小遗憾:这两篇文章没有跳出技术的角度,分析为什么会有这
412 0
|
存储 弹性计算 关系型数据库
PostgreSQL 11 内核优化 - 降低vacuum cleanup阶段index scan概率 ( vacuum_cleanup_index_scale_factor , skip index vacuum cleanup stage)
标签 PostgreSQL , vacuum_cleanup_index_scale_factor , 索引vacuum 背景 在执行vacuum时,有一个cleanup阶段,以往,不管这个阶段是否需要清理PAGE,只要表上面有索引,就需要对这个表的索引全部扫描一遍。 今天,PG 11版本,增加了一个GUC参数vacuum_cleanup_index_scale_factor,以及bt
430 0
|
存储 关系型数据库 Go
PostgreSQL 11 内核优化 - 降低vacuum cleanup阶段index scan概率 ( vacuum_cleanup_index_scale_factor , skip index vacuum cleanup stage)
PostgreSQL 11 内核优化 - 降低vacuum cleanup阶段index scan概率 ( vacuum_cleanup_index_scale_factor , skip index vacuum cleanup stage)
1265 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL技术周刊第26期:vacuum freeze无法回收事务号问题分析
PostgreSQL(简称PG)的开发者们:云栖社区已有5000位PG开发者,发布了3000+PG文章(文章列表),沉淀了700+的PG精品问答(问答列表)。 PostgreSQL技术周刊会为大家介绍最新的PG技术与动态、预告活动、最热问答、直播教程等,欢迎大家订阅PostgreSQL技术周刊。
3736 0
|
Java 关系型数据库 PostgreSQL
下一篇
无影云桌面