Последние авторы
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 ----