如何从Postgres中的选择查询更新多个项目?

时间:2015-01-02 11:57:33

标签: sql postgresql node-postgres

我使用node.js,node-postgres和Postgres组合一个脚本来处理表中的大量数据。我也使用群集模块,因此我不会遇到单个线程。

我不希望群集中的一个子进程重复另一个子进程的处理。如何更新我刚刚从选择查询中收到的行,而不会有其他进程或查询也选择相同的行?

我假设我的SQL查询看起来像:

BEGIN;
SELECT * FROM mytable WHERE ... LIMIT 100;
UPDATE mytable SET status = 'processing' WHERE ...;
COMMIT;

对于我对Postgres和SQL的了解不多而道歉,我之前曾在一个简单的PHP Web应用程序中使用过它,之前从未使用过node.js。

2 个答案:

答案 0 :(得分:1)

如果您正在使用多线程应用程序,则不能也不应该使用“for Update”(无论如何在主线程中)您需要使用的是咨询锁。每个线程都可以查询行或mnany行,验证它们是否未锁定,然后锁定它们,以便其他会话不会使用它们。在每个帖子中都很简单:

select * from mytab
where pg_try_advisory_lock(mytab.id)
limit 100

最后一定要使用pg_advisory_unlock

释放锁

答案 1 :(得分:0)

BEGIN;
UPDATE mytable SET status = 'processing' WHERE status <> "processing" and id in 
( selecy ID FROM mytable where status <> "processing" limit 100) returning * ;
COMMIT;

如果其他查询在同一行上运行,则有可能会失败 因此,如果您收到错误,请重试它,直到您获得某些数据或没有返回任何行。

如果你得到零行或者你已经完成或那里;那么太多其他的同步程序就像你的那样。