暂无图片
怎么通过heap_page_items和get_raw_page判断数据是提交了还是回滚了呢
我来答
分享
柚子身上依
2024-01-20
怎么通过heap_page_items和get_raw_page判断数据是提交了还是回滚了呢

image.png

上图分别插入了数据 1 和数据 2 ,数据 1 进行了提交,数据 2 进行了回滚,但是在 heap_page_items(get_raw_page(‘tt’,0))的结果中t_infomask2、t_infomask、t_xmax 显示的都是一样的,如何在不进行select * from tt查询时知道 heap_page_items(get_raw_page(‘tt’,0))结果中那些行数据时是正常提交的呢?

我来答
添加附件
收藏
分享
问题补充
6条回答
默认
最新
江湖小虾米

一个事务只有4种状态,处理中,提交,回滚,子事务提交。在clog中用0,1,2,3表示,一个事务占2个bit位,一个字节可以存放4个事务。你按照这个规则算一下它在哪个块里的哪个位置呗,看下具体的值就可以判断事务状态了。

暂无图片 评论
暂无图片 有用 8
打赏 0
暂无图片
江湖小虾米

事务提交状态是写到clog中的,提交时并不会修改tuple上的事务状态。只有其他事务select后才会从clog里读取相应的事务状态并更新tuple上的事务状态。类似于Oracle里的延迟块清除。原因也类似,提交的时候更新tuple可能成本很高。不select是没办法判断tuple上的事务状态的。

暂无图片 评论
暂无图片 有用 9
打赏 0
柚子身上依
题主
2024-01-21
进行 select 后,使用 SELECT * FROM heap_page_items(get_raw_page('tt', 0)); 查询的结果还是都一样的啊
江湖小虾米

看下这个https://www.modb.pro/db/1749048324070133760

暂无图片 评论
暂无图片 有用 3
打赏 0
柚子身上依

你好,文章我看了,您的意思是事物的提交状态保存在clog目录下面的文件中吧?我检查了插入提交和回滚这两个事物对应的文件已经不存在了。那在查询的时候怎么判断这两条数据那个是提交还是回滚了呢?

暂无图片 评论
暂无图片 有用 2
打赏 0
江湖小虾米

1.png
没有clog数据库实例是无法启动。我不知道你所说的两个事务对应的文件不存在了说的是不是clog目录是空的。
即使clog目录是空的,数据库也是正常的,按照你上面截图的状态,这两个事务会丢失,即任何事务都看不到这两个事务的操作。还有就是clog先是缓存在了buffer中,在一定的条件下才会刷新到clog文件中。

暂无图片 评论
暂无图片 有用 0
打赏 0
柚子身上依

image.png
你好 ,有一个0397 的文件。怎么通过这个文件人工判断一下这两个事物 963806478、963806479提交还是回滚呢,有具体的操作命令吗

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
postgreSQL 创建的只读账号如何让它拥有新建的schema权限?
回答 2
创建普通的只读角色,并针对需要访问的SCHEMA和表赋予只读访问权限:REVOKE ALLPRIVILEGES ON ALLTABLESINSCHEMAschemanam
Postgresql 怎么设置主键id自增?
回答 2
已采纳
GENERATEDALWAYSAS(generationexpr)STORED此子句将列创建为generatedcolumn。列无法被写入,读取时将返回指定表达式的结果。关键字STORED表示将在写入
MySQL迁移到postgresql,有好点的工具么?
回答 1
已采纳
Pgloader是一个支持任意数据库迁移至Postgresql的命令行工具。使用COPY流式传输协议将数据加载到PostgreSQL中,并使用单独的线程来读取和写入数据。
地理数据如何做表分区啊?
回答 2
不需要分区。如果要分大家都是按照时间维度来做。
postgreSQL怎么自动更新时间戳?
回答 1
已采纳
创建表droptableifexiststs;createtablets(idbigserialprimarykey,tradeidinteger,emailvarchar(50),numintege
硬盘空间不够了,有办法让 postgreSQL 库分散到不同的硬盘上吗?
回答 2
创建新的表空间,指向不同的目录,并修改表的表空间为新创建的表空间
autovacuum不能收集哪些类型表的统计信息?
回答 1
在PostgreSQL中,autovacuum进程是自动维护和处理数据库中的重复行、死锁、未使用的索引等问题的关键组件之一。然而,autovacuum进程无法收集以下类型表的统计信息:临时表(Temp
PostgreSQL ERROR: found xmin 2146512304 from before relfrozenxid 2146512317
回答 7
解决了,把源码的可执行文件重新替换了一下。然后表更新XMIN后重新VACUUM。
postgresql 有没有办法看出alter column一直在做什么?
回答 1
已采纳
可以试试这个sqlselectwaiteventtype,waitevent,count()frompgstatactivitywherewaiteventisnotnullgroupby1,2ord
PostgreSQL 每张表的数据到达多少行就需要分区?
回答 2
已采纳
表的数据达到多少行和表的大小其实并不能决定是否需要分区,决定是否需要分区表的应该是SQL执行效率你是否能够接受。随着时间的推移,业务量的增涨,表必将越来越大,SQL执行效率也会随之降低。当效率降低到业