| From: | Nikolay Samokhvalov <samokhvalov(at)gmail(dot)com> |
|---|---|
| To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
| Cc: | pgsql-ru-general(at)lists(dot)postgresql(dot)org |
| Subject: | Re: SELECT FOR UPDATE без транзакции |
| Date: | 2018-04-13 15:19:46 |
| Message-ID: | CANNMO+LoECSCpL1jkHH=WfMdqi5shtswkajwX7pDNGWWviZODA@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | 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.*
https://www.postgresql.org/docs/current/static/queries-with.html
В описываемом примере вообще не понятно, зачем делать select ... for
update, сам обычный update что, не поставит нужный лок на строку?
2018-04-13 0:45 GMT-07:00 Dmitry E. Oboukhov <unera(at)debian(dot)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(at)debian(dot)org>
> : :’ :
> `. `~’ GPG key: 4096R/08EEA756 2014-08-30 `- 71ED ACFC 6801
> 0DD9 1AD1 9B86 8D1F 969A 08EE A756
>
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Dmitry E. Oboukhov | 2018-04-16 12:31:53 | VACUUM to prevent wraparound |
| Previous Message | Dmitry E. Oboukhov | 2018-04-13 12:20:05 | Re: SELECT FOR UPDATE без транзакции |