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

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;

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

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

最佳答案
您可以检查内部xmin以识别新插入的行版本(注意,其中包括UPDATE的结果):

SELECT * FROM foo_table
WHERE  xmin::text = (txid_current() % (2^32)::bigint)::text;

怎么会这样?

函数txid_current()返回当前事务ID.但是,虽然xmin中的内部事务ID类型是32位宽并且每40亿个事务包装一次,但txid_current()返回一个bigint数量,per documentation:

that is extended with an “epoch” counter so it will not wrap around during the life of an installation.

有一个thread on pgsql-hackers with Tom Lane discussing it.
我从中导出了安全的WHERE条件.

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

放弃

但是,这不适用于从SAVEPOINT(或其他方式,plpython can use subtransactions)开始的子事务.那些产生单独的xids,目前无法获得属于txid_current()返回的顶级事务的xid的完整列表.在我寻找解决方案时,我在pgsql-hackers上找到了这个密切相关的线程:

> Re: rows modified in current transaction

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

有关:

> Can I select data inserted in the same uncommited transaction?

转载注明原文:如何查看PostgreSQL事务中更改的元组? - 代码日志