对PostgreSQL cmin和cmax的理解

看例子:

开两个终端来对比:

在终端A:

[pgsql@localhost bin]$ ./psql
psql (9.1.2)
Type "help" for help.pgsql=# begin;
BEGIN
pgsql=# select xmin,xmax,cmin,cmax,* from tab01;xmin | xmax | cmin | cmax |    id     | cd 
------+------+------+------+-----------+----1878 |    0 |    0 |    0 |         1 | 11884 |    0 |    0 |    0 | 999888777 | 2
(2 rows)pgsql=# insert into tab01 values(3,'3');
INSERT 0 1
pgsql=# insert into tab01 values(4,'4');
INSERT 0 1
pgsql=# select xmin,xmax,cmin,cmax,* from tab01;xmin | xmax | cmin | cmax |    id     | cd 
------+------+------+------+-----------+----1878 |    0 |    0 |    0 |         1 | 11884 |    0 |    0 |    0 | 999888777 | 21885 |    0 |    0 |    0 |         3 | 31885 |    0 |    1 |    1 |         4 | 4
(4 rows)pgsql=# 

此时的终端B:

[pgsql@localhost bin]$ ./psql
psql (9.1.2)
Type "help" for help.pgsql=# select xmin,xmax,cmin,cmax, * from tab01;xmin | xmax | cmin | cmax |    id     | cd 
------+------+------+------+-----------+----1878 |    0 |    0 |    0 |         1 | 11884 |    0 |    0 |    0 | 999888777 | 2
(2 rows)pgsql=# 

然后再在终端A进行提交:

pgsql=# commit;
COMMIT
pgsql=# select xmin,xmax,cmin,cmax,* from tab01;xmin | xmax | cmin | cmax |    id     | cd 
------+------+------+------+-----------+----1878 |    0 |    0 |    0 |         1 | 11884 |    0 |    0 |    0 | 999888777 | 21885 |    0 |    0 |    0 |         3 | 31885 |    0 |    1 |    1 |         4 | 4
(4 rows)pgsql=# 

此时,再在终端B进行观察:

pgsql=# select xmin,xmax,cmin,cmax, * from tab01;xmin | xmax | cmin | cmax |    id     | cd 
------+------+------+------+-----------+----1878 |    0 |    0 |    0 |         1 | 11884 |    0 |    0 |    0 | 999888777 | 21885 |    0 |    0 |    0 |         3 | 31885 |    0 |    1 |    1 |         4 | 4
(4 rows)pgsql=# 

 继续研究cmin是咋回事:

pgsql=# begin;
BEGIN
pgsql=# insert into tab01(id,cd) values(generate_series(5,6),'xx');
INSERT 0 2
pgsql=# select xmin,xmax,cmin,cmax,* from tab01;xmin | xmax | cmin | cmax |    id     | cd 
------+------+------+------+-----------+----1878 |    0 |    0 |    0 |         1 | 11884 |    0 |    0 |    0 | 999888777 | 21885 |    0 |    0 |    0 |         3 | 31885 |    0 |    1 |    1 |         4 | 41886 |    0 |    0 |    0 |         5 | xx1886 |    0 |    0 |    0 |         6 | xx
(6 rows)pgsql=# 

可以说cmin可理解为一个事务里,执行了几次sql命令的顺序。

那么cmax呢?在前面的基础上继续执行,居然没有看到区别:

pgsql=# update tab01 set id=2 where cd = '2';
UPDATE 1
pgsql=# select xmin,xmax,cmin,cmax,* from tab01;xmin | xmax | cmin | cmax | id | cd 
------+------+------+------+----+----1878 |    0 |    0 |    0 |  1 | 11885 |    0 |    0 |    0 |  3 | 31885 |    0 |    1 |    1 |  4 | 41886 |    0 |    0 |    0 |  5 | xx1886 |    0 |    0 |    0 |  6 | xx1886 |    0 |    1 |    1 |  2 | 2
(6 rows)pgsql=# commit;
COMMIT
pgsql=# select xmin,xmax,cmin,cmax,* from tab01;xmin | xmax | cmin | cmax | id | cd 
------+------+------+------+----+----1878 |    0 |    0 |    0 |  1 | 11885 |    0 |    0 |    0 |  3 | 31885 |    0 |    1 |    1 |  4 | 41886 |    0 |    0 |    0 |  5 | xx1886 |    0 |    0 |    0 |  6 | xx1886 |    0 |    1 |    1 |  2 | 2
(6 rows)pgsql=# 

 经过反复折腾,终于发现,其实 cmin和 cmax就是一个东西:

看源代码:

/* ----------------*        heap_getsysattr**        Fetch the value of a system attribute for a tuple.** This is a support routine for the heap_getattr macro.  The macro* has already determined that the attnum refers to a system attribute.* ----------------*/
Datum
heap_getsysattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
{Datum        result;Assert(tup);/* Currently, no sys attribute ever reads as NULL. */*isnull = false;switch (attnum){case SelfItemPointerAttributeNumber:/* pass-by-reference datatype */result = PointerGetDatum(&(tup->t_self));break;case ObjectIdAttributeNumber:result = ObjectIdGetDatum(HeapTupleGetOid(tup));break;case MinTransactionIdAttributeNumber:result = TransactionIdGetDatum(HeapTupleHeaderGetXmin(tup->t_data));break;case MaxTransactionIdAttributeNumber:result = TransactionIdGetDatum(HeapTupleHeaderGetXmax(tup->t_data));break;case MinCommandIdAttributeNumber:case MaxCommandIdAttributeNumber:/** cmin and cmax are now both aliases for the same field, which* can in fact also be a combo command id.    XXX perhaps we should* return the "real" cmin or cmax if possible, that is if we are* inside the originating transaction?*/result = CommandIdGetDatum(HeapTupleHeaderGetRawCommandId(tup->t_data));break;case TableOidAttributeNumber:result = ObjectIdGetDatum(tup->t_tableOid);break;default:elog(ERROR, "invalid attnum: %d", attnum);result = 0;            /* keep compiler quiet */break;}return result;
}

 

转载于:https://www.cnblogs.com/gaojian/p/3165178.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于自动驾驶汽车法律政策的十点思考

来源:智车科技摘要:自动驾驶技术的发展将带来全面的社会和经济影响。历史地看,传统汽车成为了人们最主要的代步工具,塑造了如今的城市。那么,自动驾驶技术在重塑汽车的同时,也将塑造未来的城市和人类生活。…

数据结构之二叉堆

二叉堆的介绍 二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两种:最大堆和最小堆。 最大堆:父结点的键值总是大于或等于任何一个子节点的键值; 最小堆:父结点的键值总是小于或等于任何一个子…

derby数据库操作比较难理解的错误及解决方法大全

一、插入(INSERT时报错) 1、错误:java.sql.SQLIntegrityConstraintViolationException: 列“test”无法接受空值。 可能原因:建表时test列为not null 但插入数据时给与了null值 2、错误:java.sql.SQLSyntaxErrorExcept…

手术革命:这三家公司如何用AR技术辅助医疗手术

来源:资本实验室作为一种重要的职业,外科医生特别是手术医生需要具备丰富的专业知识,还需要掌握精准的手术操作技术,这都需要不断的学习与练习。受学习资料、手术练习材料等软硬件条件的制约,医生进行手术学习和手术操…

C# Socket初探

闲着无聊,写了个简单的C/S Socket程序,功能很简单,服务器在9000端口监听socket接入,只要有接入,就发送"Welcome."消息给客户端。 代码分2块,server端: class Program{static void Mai…

最新发布 | 2018年度第八届吴文俊人工智能科学技术奖获奖名单公示

来源:人工智能人物摘要:2018年度第八届吴文俊人工智能科学技术奖评审工作已经完成。根据《吴文俊人工智能科学技术奖励条例》和《吴文俊人工智能科学技术奖励实施细则》相关规定,经全国各地方人工智能学会、各高校及科研院所、团体会员单位和…

ReactNative环境配置

参考链接 Windows系统安装React Native环境 windows下React Native Android 环境搭建 在Windows下搭建React Native Android开发环境 碰到的问题 react-native可能在cmd窗口提示不是内部或外部命令 解决方法:在nodeJS command prompt下可以运行 运行时卡在最…

qt.pro转成vs程序

今天下载了一个smarthome项目,界面用qml实现的, 想用vs编译生成.exe文件,在wince上运行 方法一(vs命令行): 一: 打开vs 2008 命令行,进入smarthome目录下: 二: qmake生成 smarthome.vcproj工程…

DNA存储:这些公司正在开启数据存储的未来

来源:资本实验室随着数字化时代的到来,可以毫不夸张地说,数据存储与安全正在成为整个社会正常运行的基础。同时,物联网、人工智能、虚拟现实、自动驾驶等新技术的应用则进一步大幅提升了数据存储要求。据IDC预测,到202…

React基础语法学习

React主要有如下3个特点: 作为UI(Just the UI)虚拟DOM(Virtual DOM):这是亮点 是React最重要的一个特性 放进内存 最小更新的视图,差异部分更新 diff算法数据流(Date Flow)单向数据流 学习Re…

C#中ListT用法

所属命名空间&#xff1a;System.Collections.Generic public classList<T> :IList<T>,ICollection<T>,IEnumerable<T>,IList,ICollection,IEnumerable List<T>类是ArrayList类的泛型等效类。该类使用大小可按需动态增加的数组实现IList<…

算力超英伟达?华为推出两款“昇腾”芯片;五大AI战略正式公布

来源&#xff1a;AI科技大本营华为也像是要 All in AI 了。10 月 10 日&#xff0c;华为全联接大会 2018 上&#xff0c;华为轮值董事长徐直军带来了一系列的硬核 AI。在大会上&#xff0c;他系统公布了华为的 AI 发展战略&#xff0c;以及全栈全场景 AI 解决方案&#xff0c;其…

Qt5:渐变效果的实现

http://devbean.blog.51cto.com/448512/238168/ 转载于:https://www.cnblogs.com/wowk/p/3174602.html

React之JSX入门

React是由ReactJS与React Native组成&#xff0c;其中ReactJS是Facebook开源的一个前端框架&#xff0c;React Native 是ReactJS思想在native上的体现&#xff01; JSX并不是一门新的语言&#xff0c;仅仅是个语法糖&#xff0c;允许开发者在JavaScript中书写HTML语法。&…

英特尔人工智能副总裁:AI不是一种技能,而是一种对于工作的描述

来源&#xff1a;网络大数据人工智能领域的迅速发展&#xff0c;相关人才不能满足需求已经成为业界共识。有报道称&#xff0c;因为人工智能工程师庞大的缺口&#xff0c;一些公司为了获得人才不得不支付数百万美元的薪水。如何满足对人工智能工程师不断增长的招聘和培训的需求…

html 中表格长度固定

2010-02-03 14:25 1070人阅读 评论(0) 收藏 举报htmlclassxhtml产品bordertable<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns"http://www.w3.org/1999/xht…

React Native实例

本文主要包括以下内容 View组件的实例 Text组件实例 Navigator组件实例 TextInput组件实例 View组件的实例 效果如下 代码如下 /*** Sample React Native App* https://github.com/facebook/react-native* flow*/import React, { Component } from react; import {AppRe…

谷歌的硬件梦:Pixel手机、ChromeOS平板和Home音箱

来源&#xff1a; 网易智能&#xff08;北京时间10月9日23点&#xff09;&#xff0c;谷歌在纽约如期举行了主题为“谷歌制造”&#xff08;Made By Google&#xff09;的硬件发布会&#xff0c;推出了Pixel手机、平板 笔记本&#xff0c;以及音箱等一系列新品硬件。一个月以来…

浅用block 转

block是一门有用的大后期学问。现在我只是列出一点基本用法。 1.快速枚举&#xff08;Enumeration&#xff09; 通常是和NSArray, NSDictionary, NSSet, NSIndexSet放在一起用。 当和以上这两种东西放在一起用时&#xff0c;通常block有两种用处。&#xff08;代码为实例操作&a…

数据结构之图的实现

本文主要包括以下内容 邻接矩阵实现无向图 邻接表实现无向图 邻接矩阵实现有向图邻接表实现有向图 图的理论基础&#xff0c;请参考&#xff1a;图的理论基础 - 如果天空不死 - 博客园 邻接矩阵实现无向图 MatrixUDG是邻接矩阵对应的结构体。 mVexs用于保存顶点&#xf…