我使用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。
答案 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;
如果其他查询在同一行上运行,则有可能会失败 因此,如果您收到错误,请重试它,直到您获得某些数据或没有返回任何行。
如果你得到零行或者你已经完成或那里;那么太多其他的同步程序就像你的那样。