Если два запроса (чтение и обновление) происходят внутри одной транзакции READ COMMITED, то, понятное дело, мы не можем быть уверены, что обновление обязательно произойдет. Данные могли измениться в другой транзакции.
А как насчет одного выражения? Судя из документации внутри выражения видны одни и те же строки. Можем ли мы быть уверены, что в следующей конструкции обновление обязательно произойдет (считаем что SELECT вернул какие-то данные)?
WITH t (
SELECT id
FROM test
WHERE (id = 1) AND (value = 2)
RETURNING id
)
UPDATE test
SET value = 3
FROM t
WHERE
(test.id = t.id)
AND (t.value = t.value)
Дополнительно: есть ли какой-то способ это проверить, чтобы не задавать такие вопросы. Есть ли какой-нибудь инструмент, чтобы приостановить запрос и посмотреть что будет, если произойдет X?