Re: SELECT FOR UPDATE без транзакции - Mailing list pgsql-ru-general

From Nikolay Samokhvalov
Subject Re: SELECT FOR UPDATE без транзакции
Date
Msg-id CANNMO+LoECSCpL1jkHH=WfMdqi5shtswkajwX7pDNGWWviZODA@mail.gmail.com
Whole thread Raw
In response to SELECT FOR UPDATE без транзакции  ("Dmitry E. Oboukhov" <unera@debian.org>)
List 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 by date:

Previous
From: "Dmitry E. Oboukhov"
Date:
Subject: Re: SELECT FOR UPDATE без транзакции
Next
From: "Dmitry E. Oboukhov"
Date:
Subject: VACUUM to prevent wraparound