结论1:

  1. xmax和Infomask匹配使用,可能保存修改者的xid,也可能保存读或写行锁的xid。
  2. 如果保存读写行锁的xid,只要加过行锁,就算释放了xmax也会一直记录xid。
  3. 如果保存读行锁的xid,如果有多个事务加行锁,xmax会保存multixact数组的位置,具体信息存在multixact结构中(SLRU页面同CLOG)。

结论2:

注意到PG使用xmax记录行锁的事务ID,那么判断行锁还有没有就依赖xid的状态了,也就是CLOG。

在vacuum freeze的时候如果看到xmax上记录的事务ID过旧,也需要freeze的:

  • vacuum_multixact_freeze_min_age 同 autovacuum_freeze_max_age : 五千万开始正常vacuum freeze,用最新xid-五千万=Limit,扫描页面如果有脏数据顺便freeze。
  • autovacuum_multixact_freeze_max_age 同 autovacuum_multixact_freeze_max_age : 两亿开始eager freeze取oldxmin为Limit,用Limit来freeze所有页面。

正常保存

create table m7(id int primary key, info text);
insert into m7 select generate_series(1,10), md5(random()::text);
select lp,lp_off,lp_flags,lp_len,t_xmin,t_xmax,t_field3,t_ctid,t_infomask2,t_infomask,t_hoff,t_bits,t_oid from heap_page_items(get_raw_page('m7',0));lp | lp_off | lp_flags | lp_len |   t_xmin   | t_xmax | t_field3 | t_ctid | t_infomask2 | t_infomask | t_hoff | t_bits | t_oid
----+--------+----------+--------+------------+--------+----------+--------+-------------+------------+--------+--------+-------1 |   8128 |        1 |     61 | 1477538885 |      0 |        0 | (0,1)  |           2 |       2050 |     24 |        |      2 |   8064 |        1 |     61 | 1477538885 |      0 |        0 | (0,2)  |           2 |       2050 |     24 |        |      3 |   8000 |        1 |     61 | 1477538885 |      0 |        0 | (0,3)  |           2 |       2050 |     24 |        |      4 |   7936 |        1 |     61 | 1477538885 |      0 |        0 | (0,4)  |           2 |       2050 |     24 |        |      5 |   7872 |        1 |     61 | 1477538885 |      0 |        0 | (0,5)  |           2 |       2050 |     24 |        |      6 |   7808 |        1 |     61 | 1477538885 |      0 |        0 | (0,6)  |           2 |       2050 |     24 |        |      7 |   7744 |        1 |     61 | 1477538885 |      0 |        0 | (0,7)  |           2 |       2050 |     24 |        |      8 |   7680 |        1 |     61 | 1477538885 |      0 |        0 | (0,8)  |           2 |       2050 |     24 |        |      9 |   7616 |        1 |     61 | 1477538885 |      0 |        0 | (0,9)  |           2 |       2050 |     24 |        |      10 |   7552 |        1 |     61 | 1477538885 |      0 |        0 | (0,10) |           2 |       2050 |     24 |        |      postgres=# select lp,lp_len,t_xmin,t_xmax,t_ctid,t_infomask2,t_infomask,t_hoff from heap_page_items(get_raw_page('m7',0));lp | lp_len |   t_xmin   |   t_xmax   | t_ctid | t_infomask2 | t_infomask | t_hoff
----+--------+------------+------------+--------+-------------+------------+--------1 |     61 | 1477538885 | 1477538886 | (0,1)  |        8194 |        258 |     242 |     61 | 1477538885 |          0 | (0,2)  |           2 |       2050 |     243 |     61 | 1477538885 |          0 | (0,3)  |           2 |       2050 |     244 |     61 | 1477538885 |          0 | (0,4)  |           2 |       2050 |     245 |     61 | 1477538885 |          0 | (0,5)  |           2 |       2050 |     246 |     61 | 1477538885 |          0 | (0,6)  |           2 |       2050 |     247 |     61 | 1477538885 |          0 | (0,7)  |           2 |       2050 |     248 |     61 | 1477538885 |          0 | (0,8)  |           2 |       2050 |     249 |     61 | 1477538885 |          0 | (0,9)  |           2 |       2050 |     2410 |     61 | 1477538885 |          0 | (0,10) |           2 |       2050 |     24

id=1删除提交

id=2删除回滚

id=3行读锁

id=4行写锁

id=5行2读锁

postgres=# select lp,lp_len,t_xmin,t_xmax,t_ctid,t_infomask2,t_infomask,t_hoff from heap_page_items(get_raw_page('m7',0));lp | lp_len |   t_xmin   |   t_xmax   | t_ctid | t_infomask2 | t_infomask | t_hoff
----+--------+------------+------------+--------+-------------+------------+--------1 |     61 | 1477538885 | 1477538886 | (0,1)  |        8194 |        258 |     242 |     61 | 1477538885 | 1477538887 | (0,2)  |        8194 |        258 |     243 |     61 | 1477538885 | 1477538889 | (0,3)  |           2 |        466 |     244 |     61 | 1477538885 | 1477538890 | (0,4)  |        8194 |        450 |     245 |     61 | 1477538885 |        343 | (0,5)  |           2 |       4562 |     246 |     61 | 1477538885 |          0 | (0,6)  |           2 |       2050 |     247 |     61 | 1477538885 |          0 | (0,7)  |           2 |       2050 |     248 |     61 | 1477538885 |          0 | (0,8)  |           2 |       2050 |     249 |     61 | 1477538885 |          0 | (0,9)  |           2 |       2050 |     2410 |     61 | 1477538885 |          0 | (0,10) |           2 |       2050 |     24t_infomask
258:  HEAP_HASVARWIDTH |                                                                     HEAP_XMIN_COMMITTED
466:  HEAP_HASVARWIDTH | HEAP_XMAX_KEYSHR_LOCK | HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_LOCK_ONLY | HEAP_XMIN_COMMITTED
450:  HEAP_HASVARWIDTH |                         HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_LOCK_ONLY | HEAP_XMIN_COMMITTED
4562: HEAP_HASVARWIDTH | HEAP_XMAX_KEYSHR_LOCK | HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_LOCK_ONLY | HEAP_XMIN_COMMITTED | HEAP_XMAX_IS_MULTI
2050: HEAP_HASVARWIDTH | HEAP_XMAX_INVALIDt_infomask2
8194: 0010000000000010 : HEAP_KEYS_UPDATED | 低11位保存元素数量,这里是两列
2   : 0000000000000010 : 低11位保存元素数量,这里是两列

Postgresql页面xmax与multixact相关推荐

  1. PostgreSQL B+树索引---页面删除

    PostgreSQL B+树索引-页面删除 预备知识 <PostgreSQL Blink-tree ReadMe-翻译> <PostgreSQL Buffer ReadMe-翻译&g ...

  2. PostgreSQL重启恢复---XLOG 2.0

    XLOG 2.0 预备知识 <PostgreSQL重启恢复-XLOG 1.0> 概述 在<PostgreSQL重启恢复-XLOG>中,我们查询的XLOG的组织结构.XLOG写入 ...

  3. Confluence 6 已经存在的安装配置数据库字符集编码

    2019独角兽企业重金招聘Python工程师标准>>> 针对已经存在的 Confluence 安装,如果你安装的 Confluence 版本是 6.4 或者早期的版本,我们在安装的时 ...

  4. sql 最外层传值给最内层查询_腾讯云高级工程师如何玩转PG查询处理与执行器算法...

    作者介绍 孙旭,腾讯云高级工程师.10年数据库内核研发经验,熟悉PostgreSQL.Teradata数据库内核,熟悉数据库的查询优化.执行.事务并发以及存储等子系统:对分布式数据库有深入的研究和研发 ...

  5. Ora2Pg 工具介绍

    文章目录 官方地址:http://ora2pg.darold.net Ora2Pg 是一个免费工具,用于将 Oracle 或者 MySQL 数据库迁移到 PostgreSQL.它通过连接 Oracle ...

  6. postgresql源码学习(十三)—— 行锁①-行锁模式与xmax

    一. 四种行锁 1. 简介与兼容性分析 pg采用元组级常规锁+xmax结合的方式实现行锁.我们曾经提到过常规锁是有很多类TAG的(typedef enum LockTagType),其中 LOCKTA ...

  7. PostgreSQL如何实现MVCC (基于xmin、xmax、cmin、cmax)

    声明:本文是<PostgreSQL实战>读书笔记,参考了http://www.jasongj.com/sql/mvcc/ 部分,可以参考该书事务与并发控制章节 和 http://www.j ...

  8. PostgreSQL XMAX深入探究

    PostgreSQL每张表中都包含系统字段,详见:PostgreSQL表的系统字段 对于XMAX字段,其官方文档的解释如下: The identity (transaction ID) of the ...

  9. postgresql 数据库表隐藏列 oid、tableoid、ctid、xmin、xmax、cmin、cmax

    os: centos 7.4 db: postgresql 10.11 oid.tableoid.ctid.xmin.xmax.cmin.cmax 这些都是 postgresql 数据库表的隐藏列. ...

最新文章

  1. 20以内混合加减法100题_一年级数学20以内加减法混合运算练习题,寒假练习巩固!...
  2. 如何管理并设计你的口令
  3. excel对比_质量管理误区:SPC软件与微软Excel的应用对比
  4. Java程序运行纳秒级差值计算
  5. java listen_Java进阶-IO基础
  6. 超乎想象,数据揭示自学成才的码农为何备受青睐
  7. git 提交_GIT提交规范的使用和总结
  8. 【体系结构】Oracle表空间的简单理解
  9. Objective-C ---JSON 解析 和 KVC
  10. Spring 实现发送电子邮件的两种方法
  11. javaScript 对象访问属性的另一种方式
  12. bootstrap-wysiwyg中JS控件富文本中的图片由本地上传到服务器(阿里云、七牛、自己的数据库)...
  13. linux把程序添加到全局环境变量
  14. Sqlite日期查询
  15. 智能车摄像头组怎么在OLED屏画出中线
  16. ROS进阶功能—action通信机制
  17. 软件类大学生求职就业攻略(四)——求职面试
  18. 启动3ds Max报 d3dx9_43.dll丢失 解决方法
  19. 关于Mysql出现1045错误的方法
  20. 模糊数学 4、模糊模式识别

热门文章

  1. 基于Token的身份验证的原理
  2. Gitea服务搭建指南
  3. WIN2003 R2安装EPSON6200L打印机问题解决
  4. 2021年日本互联网服务业发展现状:ZHD和LINE 的合并将改变日本互联网行业格局[图]
  5. 仿知乎app登录界面(Material Design设计框架拿来就用的TexnInputLayout)
  6. android wifi增强,Android增强WiFi性能
  7. 大连python薪酬_大连Python开发靠谱吗
  8. r7 6800u核显相当于什么显卡
  9. 学3D建模要注意什么问题?入行好几年,踩过的坑后的经验
  10. 重装系统(GHO)镜像介绍及下载