Se eu fizer uma consulta usando CTEs parecida com esta:
WITH cte_a AS (
SELECT a.id, a.something
FROM a
WHERE a.something IS NOT NULL
),
-- [...] some other CTEs
cte_d AS (
SELECT
cte_a.id,
cte_a.something
FROM cte_a
JOIN
-- something
JOIN
-- something
WHERE
-- something
ORDER BY cte_a.id ASC
FOR UPDATE -- Here, will the `FOR UPDATE` locks `a` rows?
),
-- rest of the query, which will update `a.something`.
O bloqueio para atualização será aplicado nas linhas da tabela a
ou o bloqueio será aplicado em uma tabela materializada gerada por cte_a
?
Se o bloqueio se aplicar à tabela materializada, o seguinte resolveria o problema?
WITH cte_a AS NOT MATERIALIZED (
-- Rest of the query
Estou usando o PostgreSQL v14.
Se isso mudar alguma coisa, estou mais interessado no comportamento com o nível de isolamento READ COMMITTED padrão.