我正在使用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)将不会向前移动(即使所有忙交易都已完成)。所以这也不起作用。
答案 0 :(得分:0)
直接执行此操作并不是一个非常好的方法。我认为最好的选择实际上是创建一个在事务提交时截断的临时表,以及一个将该表插入该表的触发器。然后,您可以从临时表中查找值。