递归查询中的行锁定

moi*_*moi 5 sql postgresql

文件说:

锁定子句不能用于无法用单个表行清楚地标识返回行的上下文中; 例如,它们不能与聚合一起使用.

我如何在递归查询的设置中解决这个问题,这是通过实现的UNION (ALL)

有没有比再次将表的递归查询结果加入更好的解决方案,这一次FOR UPDATE?我必须为此查询锁定整个表,以确保没有任何内容同时更改为连接,对吧?

Eva*_*oll 0

是什么让您认为聚合与递归查询有关系?似乎对我有用,

CREATE TABLE foo(pk,fk,description)
AS VALUES
    ( 1 , null , 'domains' ),
    ( 2 , 1 , 'people' ),
    ( 3 , 1 , 'cars' ),
    ( 4 , 2 , 'tom' ),
    ( 5 , 2 , 'smith' ),
    ( 6 , 3 , 'vmw' ),
    ( 7 , 2 , 'betty' ),
    ( 8 , 3 , 'ford' );

WITH RECURSIVE t(pk, fk, description, level) AS (
    SELECT pk, fk, ARRAY[description], 0
    FROM foo
    WHERE fk IS NULL
    UNION ALL
        SELECT foo.pk, foo.fk, t.description || foo.description, t.level+1
        FROM t
        JOIN foo ON (foo.fk = t.pk)
)
SELECT *
FROM t
FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)

示例取自 dba.se 上此问题的示例