对于更新,NOWAIT 不起作用



有两个查询:

1.

BEGIN;
SELECT * FROM "Users"
WHERE "Users"."Name" = 'user0'
FOR UPDATE NOWAIT ;
select pg_sleep(30);
END;

2.

BEGIN;
UPDATE "Users"
SET "Respect" = 2
WHERE "Users"."Name" = 'user0';
END;

当我使用NOWAIT时,我预计第二个查询会返回错误,但它对我不起作用。第二个询问只是挂起并等待第一个。我错过了什么?我尝试了9.2-9.4的Postgres。

NOWAIT会影响它所在的语句。它不会影响希望等待而不是报告错误的其他语句。

如果您的第二个查询无法锁定行,则需要将其重写为使用select ... for update nowait,然后使用update...。update语句本身没有nowait选项。

BEGIN transaction;
select "Respect" from "Users" where "Name" = 'user0' for update nowait;
UPDATE "Users"
SET "Respect" = 2
WHERE "Users"."Name" = 'user0';
END;

最新更新