Важный момент, который в CTE постгресовых всегда надо держать в уме:
The sub-statements inWITHare executed concurrently with each other and with the main query. Therefore, when using data-modifying statements inWITH, the order in which the specified updates actually happen is unpredictable.
В описываемом примере вообще не понятно, зачем делать select ... for update, сам обычный update что, не поставит нужный лок на строку?
2018-04-13 0:45 GMT-07:00 Dmitry E. Oboukhov <unera@debian.org>:
а можно ли применять SELECT FOR UPDATE в составных запросах?
то есть транзакцию не объявляем/начинаем, а пишем однократный автокоммит-запрос, нечто вроде:
WITH "s1" AS ( -- тут блокируемся SELECT * FROM "t" WHERE id = $1 FOR UPDATE ),
"v1" AS ( -- тут вычисляем значение SELECT SUM("v") AS "v" FROM "t2" WHERE "bla" = $2 ) UPDATE -- а дальше собственно update "t" SET "v" = (SELECT v FROM v1) FROM "s1" WHERE "t"."id" = "s1"."id"