Изменения документа MSSQL. Организация блокировок с пропуском заблокированных
Редактировал(а) Alexandr Fokin 2024/06/07 23:56
отредактировано Alexandr Fokin
на 2024/06/07 23:49
на 2024/06/07 23:49
отредактировано Alexandr Fokin
на 2024/06/07 23:52
на 2024/06/07 23:52
Изменить комментарий:
К данной версии нет комментариев
Комментарий
-
Свойства страницы (1 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Содержимое
-
... ... @@ -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 +----