如何查看 PostgreSQL 事务中更改的元组?

vol*_*ron 6 postgresql transaction

BEGIN;

   INSERT INTO foo_table(foo_column) VALUES('a'),('b'),('c');

   -- SELECT * FROM pg_stat_activity WHERE ...
   -- shows records with a flag if they have been added/deleted/updated

END;
Run Code Online (Sandbox Code Playgroud)

有没有办法查看 PostgreSQL 9.x 中给定表的事务未提交的插入/删除?这纯粹是为了视觉确认。

虽然我最初的想法是否定的(只对表执行 SQL-Select),但某些用户想要可视化事务中的差异。如果有很多保存点和事务,我可以看到这会有什么帮助。因此,值得向整个社区询问。

Erw*_*ter 9

您可以检查内部xmin以识别新插入的行版本(注意,包括来自 的结果UPDATE):

SELECT * FROM foo_table
WHERE  xmin::text = (txid_current() % (2^32)::bigint)::text;
Run Code Online (Sandbox Code Playgroud)

为何如此?

该函数txid_current()返回当前事务 ID。然而,虽然内部交易 ID 类型xmin为 32 位宽,每 40 亿次交易都包含 在内,但根据文档txid_current()返回一个bigint数量

它扩展了一个“纪元”计数器,因此它在安装的生命周期内不会环绕。

有一个关于 pgsql-hackers线程,Tom Lane 正在讨论它。
我从中得出了安全WHERE条件。

寻址注释:在同一事务中删除的已删除行始终不可见,因此不包含在结果中。

免责声明

但是,这不适用于以 开头的子事务SAVEPOINT(或其他方式,plpython 也可以使用子事务)。那些产生单独的 xid,目前无法获得属于由txid_current(). 在寻找解决方案时,我在 pgsql-hackers 上发现了这个密切相关的线程:

我目前没有看到解决该限制的可靠解决方案。

有关的: