如何获取提交前所有行的最后一个Postgresql序列号?

时间:2012-02-14 05:42:45

标签: postgresql

我正在使用Postgresql 9.0.5并且我有一个cron作业,它定期从表中读取新创建的行,并将其值累积到具有每小时数据的汇总表中。

我需要获取提交的最新ID(序列)以及提交之前的所有行。

在这种情况下,currval函数不会给出正确的值,因为事务插入currval可能比其他更早提交。稍后使用SELECT语句,我可以看到Id列不连续,因为某些行仍未提交。

Here is some sample code I have used to test:
--test race condition
create table mydata(id serial,val int);

--run in thread 1
create or replace function insert_delay() returns void as $$
begin
insert into mydata(val) values (1);
perform pg_sleep(60);
end;
$$ language 'plpgsql';

--run in thread 2
create or replace function insert_ok() returns void as $$
begin
insert into mydata(val) values (2);
end;
$$ language 'plpgsql';

--run in thread 3
mytest=# select * from mydata;  --SHOULD HAVE SEEN id = 1 and 2;
 id | val
----+-----
  2 |   2
(1 row)

我甚至试过了一些如下所示的陈述;

select max(id) from mydata age(xmin) >= age(txid_snapshot_xmin(txid_current_snapshot())::text::xid);

但是在生产线(运行高容量交易)中,返回的最大值(id)将不会向前移动(即使所有忙交易都已完成)。所以这也不起作用。

1 个答案:

答案 0 :(得分:0)

直接执行此操作并不是一个非常好的方法。我认为最好的选择实际上是创建一个在事务提交时截断的临时表,以及一个将该表插入该表的触发器。然后,您可以从临时表中查找值。