PostgreSQL: получить консультативную блокировку, если ее не ожидает более n транзакций
У меня есть ресурс, который получают от распределенных клиентов. Этот ресурс защищен блокировкой уровня транзакции:
ВЫБЕРИТЕ pg_advisory_xact_lock(123456)
Я знаю, что могу использовать pg_try_advisory_xact_lock
если я не хочу ждать, пока он станет бесплатным. Если бы я получил - звонок вернетсяtrue
, иначе false
.
Я бы хотел добиться поведения pg_advisory_xact_lock
с размером очереди. Если от блокировки ожидают менее 4 транзакций, присоединитесь к ним в ожидании, в противном случае верните falsepg_try_advisory_xact_lock
иначе. Если удалось получить блокировку - верните true.
Могу ли я добиться этого без написания расширения для plv8? Есть идеи?
Я использую PostgreSQL 10.
1 ответ
Прокрутите "pg_try_advisory_xact_lock(...)" по 5 различным идентификаторам блокировки (скажем, с 123457 по 123461) (1 реальный держатель блокировки и еще 4 не удерживающих официанта = 5). Получение одного из них дает вам право ждать "настоящего" идентификатора блокировки. Неспособность получить любой из 5 результатов приведет к неудаче. Это означает, что вам нужно зарезервировать / координировать 6 магических констант, а не 1.