递归查询中的行锁定

时间:2018-08-31 18:51:51

标签: sql postgresql

documentation说:

  

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

如何在通过UNION (ALL)实现的递归查询中解决此问题?

是否有比将递归查询的结果再次与表(这次与FOR UPDATE合并)更好的解决方案?我必须为此查询锁定整个表,以确保对联接没有任何并发​​更改,对吗?

1 个答案:

答案 0 :(得分: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;

Example taken from example on this question on dba.se