有两个查询:
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;