あるセッションで、「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
。
私は何を誤解していますか?
PS
最初のトランザクションの場合、CTE の代わりに次を使用します。
perform id, status FROM users WHERE id in( 2,4,7,6) order by id FOR UPDATE;
その後、ロックは期待どおりに機能します。