Организация блокировок с пропуском заблокированных

Версия 1.5 от Alexandr Fokin на 2024/03/16 20:12

 Пессимистичная блокировка 
 https://postgrespro.ru/docs/postgresql/12/functions-admin 
Блокировка через основной механизм БДBegin;

 select *
 from table
 FOR UPDATE SKIP LOCKED;

 --action

Commit;
 
Рекомендательные блокировкиBegin;

 select *
 from table
 where
 -- (table or action key, rowKey)
 pg_try_advisory_xact_lock(1, id)
 -- or pg_try_advisory_xact_lock(1, uuid_hash(guidId))
 
 -- action

Commit;

Данный подход может комбинироваться с вышестоящим.

Пример: Мы сначала отбираем батч id, чтобы потом обработать каждую запись в отдельной транзакции. Мы не хотим блокировать сами строки, но также не хотим, чтобы другой (параллельный) обработчик отбирал их к себе.
Мы можем использовать рекомендательную блокировку. При этом при обработке каждой строки отдельной транзакцией мы накладываем For Update.

ЗАМЕЧАНИЕ: данный способ блокировки может подходить не для всех сценариев.
Не подходит для ситуаций, когда выборка содержит условия к другим таблицам (JOIN или EXSISTS).
При использовании сортировок необходимо убедиться в наличии индексов.
Иначе может приводить к ситуации, когда при считывании (по where) будет заблокировано больше строк, чем планировалось.

   
   

 

Теги: