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.

Другие вопросы по тегам