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),但某些用户想要可视化事务中的差异。如果有很多保存点和事务,我可以看到这会有什么帮助。因此,值得向整个社区询问。
您可以检查内部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 上发现了这个密切相关的线程:
我目前没有看到解决该限制的可靠解决方案。
有关的: