在一个会话中,我尝试锁定“users”表中的多行,并获取 user 的“status”列WHERE id = 2
。
do $$
declare user_status int;
begin
WITH t(id, status) AS(
SELECT id, status FROM users WHERE id in( 2,4,7,6) order by id FOR UPDATE
)
SELECT status FROM t WHERE id = 2 INTO user_status;
-- just run transaction for a while
FOR i in 1..2000000000 loop
end loop;
end;
$$ language plpgsql
在此事务运行时,我在另一个会话中运行此查询:
UPDATE users SET some_col = some_col WHERE id = 6;
我希望该行WHERE id = 6
应该被第一个事务锁定,但这不是真的,因为UPDATE
在第二个会话中立即运行(不等待在第一个会话中结束事务)。
我有什么误解?
附言
如果在第一次交易中,而不是 CTE 使用:
perform id, status FROM users WHERE id in( 2,4,7,6) order by id FOR UPDATE;
然后锁按预期工作。