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

Page / - Изменено Alexandr Fokin в 2024/06/07 23:49 

PostgreSQL. Организация блокировок с пропуском заблокированных 
Изменено Alexandr Fokin
в 2024/06/07 23:49

Оглавление

 	Пессимистичная блокировка	 	
 	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 или сортировке, чтобы не блокировать больше строк, чем нужно.
Postgres pg_try_advisory_lock blocks all records
https://stackoverflow.com/questions/20115907/postgres-pg-try-advisory-lock-blocks-all-records
select t1.id
from (
SELECT 
  t1.id,
  pg_catalog.pg_try_advisory_xact_lock(-1, t1.id) as locked
FROM table1 AS t1
 join table2 as r2 on
--WHERE rules
) t1
where
 t1.locked
LIMIT 20;	

Внутренние ссылки:
Дочерние страницы:
Обратные ссылки:
•	Организация блокировок с пропуском заблокированных