Редактировал(а) Alexandr Fokin 2024/06/07 23:56

От версии 1.1 >
отредактировано Alexandr Fokin
на 2024/06/07 23:49
К версии < 1.2 >
отредактировано Alexandr Fokin
на 2024/06/07 23:52
>
Изменить комментарий: К данной версии нет комментариев

Комментарий

Подробности

Свойства страницы
Содержимое
... ... @@ -1,0 +1,75 @@
1 +
2 +
3 +| |[[Пессимистичная блокировка>>doc:Архитектура и модели.Блокировки.Пессимистичная блокировка.WebHome]]|
4 +| |[[https:~~/~~/postgrespro.ru/docs/postgresql/12/functions-admin>>https://postgrespro.ru/docs/postgresql/12/functions-admin]]|
5 +|Блокировка через основной механизм БД|{{code language="sql"}}Begin;
6 +
7 + select *
8 + from table
9 + FOR UPDATE SKIP LOCKED;
10 +
11 + --action
12 +
13 +Commit;{{/code}}|
14 +|Рекомендательные блокировки|{{code language="sql"}}Begin;
15 +
16 + select *
17 + from table
18 + where
19 + -- (table or action key, rowKey)
20 + pg_try_advisory_xact_lock(1, id)
21 + -- or pg_try_advisory_xact_lock(1, uuid_hash(guidId))
22 +
23 + -- action
24 +
25 +Commit;{{/code}}|(((
26 +|Данный подход может комбинироваться с вышестоящим.
27 +|Пример: Мы сначала отбираем батч id, чтобы потом обработать каждую запись в отдельной транзакции. Мы не хотим блокировать сами строки, но также не хотим, чтобы другой (параллельный) обработчик отбирал их к себе.
28 +Мы можем использовать рекомендательную блокировку. При этом при обработке каждой строки отдельной транзакцией мы накладываем For Update.
29 +|(((
30 +ЗАМЕЧАНИЕ: быть аккуратнее при использовании условий с JOIN или сортировке, чтобы не блокировать больше строк, чем нужно.
31 +
32 +Postgres pg_try_advisory_lock blocks all records
33 +[[https:~~/~~/stackoverflow.com/questions/20115907/postgres-pg-try-advisory-lock-blocks-all-records>>https://stackoverflow.com/questions/20115907/postgres-pg-try-advisory-lock-blocks-all-records]]
34 +
35 +{{code language="sql"}}
36 +select t1.id
37 +from (
38 + SELECT
39 + t1.id,
40 + pg_catalog.pg_try_advisory_xact_lock(-1, t1.id) as locked
41 + FROM table1 AS t1
42 + join table2 as r2 on
43 + --WHERE rules
44 +) t1
45 +where
46 + t1.locked
47 +LIMIT 20;
48 +{{/code}}
49 +)))
50 +)))
51 +| | |
52 +
53 +----
54 +
55 +==== Внутренние ссылки: ====
56 +
57 +====== Дочерние страницы: ======
58 +
59 +{{children/}}
60 +
61 +====== Обратные ссылки: ======
62 +
63 +{{velocity}}
64 +#set ($links = $doc.getBacklinks())
65 +#if ($links.size() > 0)
66 + #foreach ($docname in $links)
67 + #set ($rdoc = $xwiki.getDocument($docname).getTranslatedDocument())
68 + * [[$escapetool.xml($rdoc.fullName)]]
69 + #end
70 +#else
71 + No back links for this page!
72 +#end
73 +{{/velocity}}
74 +
75 +----