也许这是一个愚蠢的初学者问题,但我在任何地方都找不到答案。我到处都读到了Transaction Isolation
解决并发事务中数据可见性的方法。我关心的是单个事务中的行为。
如果我开始一个事务,插入一些数据,我是否能够在之后立即选择它们 - 仍然在同一个但未提交的事务中?如果是,在并发事务的情况下,这种行为是否可以像提到的事务隔离一样以类似的方式改变?
具体来说,我的目标是 PostgreSQL 9.4。
除了常规列之外,Postgres 表还有各种可用的系统列。其中之一,xmin
,存储用于创建行的事务 ID。它的数据类型是xid
,一个四字节整数,在某个点环绕(即不一定是唯一的)。该函数txid_current()
反过来返回当前事务 ID,但作为bigint
,因为它“使用“纪元”计数器进行了扩展,因此它不会在安装的生命周期内回绕”(引用手册)。
如果尚未发生交易回绕,则两个值似乎都匹配:
# CREATE TABLE test (label text);
CREATE TABLE
# INSERT INTO test VALUES ('test') RETURNING txid_current();
txid_current
--------------
674500
(1 row)
INSERT 0 1
# SELECT xmin FROM test;
xmin
--------
674500
(1 row)
Run Code Online (Sandbox Code Playgroud)
但我想知道:这两个值总是具有可比性吗?据我了解,txid_current()
将在交易 ID 环绕(最多 2^32 个交易)后继续提供唯一值,xmin
并将从零开始。这意味着两者都在那时开始返回不同的值?
如果这是真的,有没有办法来提取规则xid
一的txid_current()
结果,以便它匹配xmin
的表(例如铸造项目txid_current()
,以整数)?
编辑:更清楚地说明我关心事务 ID 环绕之后会发生什么,这很可能发生在 2^32 事务之前很久。感谢 Daniel Vérité 在评论中指出这一点。
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),但某些用户想要可视化事务中的差异。如果有很多保存点和事务,我可以看到这会有什么帮助。因此,值得向整个社区询问。