2

あるセッションで、「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;

その後、ロックは期待どおりに機能します。

4

1 に答える 1