Re: SELECT FOR UPDATE без транзакции
От | Nikolay Samokhvalov |
---|---|
Тема | Re: SELECT FOR UPDATE без транзакции |
Дата | |
Msg-id | CANNMO+LoECSCpL1jkHH=WfMdqi5shtswkajwX7pDNGWWviZODA@mail.gmail.com обсуждение исходный текст |
Ответ на | SELECT FOR UPDATE без транзакции ("Dmitry E. Oboukhov" <unera@debian.org>) |
Список | pgsql-ru-general |
Важный момент, который в CTE постгресовых всегда надо держать в уме:
The sub-statements in
WITH
are executed concurrently with each other and with the main query. Therefore, when using data-modifying statements in WITH
, 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"
--
. ''`. Dmitry E. Oboukhov <unera@debian.org>
: :’ :
`. `~’ GPG key: 4096R/08EEA756 2014-08-30 `- 71ED ACFC 6801 0DD9 1AD1 9B86 8D1F 969A 08EE A756
В списке pgsql-ru-general по дате отправления: