Приобретение консультативных замков в postgres

Я думаю, что должно быть что-то основное, что я не понимаю о консультативной блокировке в postgres. Если я ввожу следующие команды на клиенте командной строки psql, функция возвращает true оба раза:

SELECT pg_try_advisory_lock(20); --> true
SELECT pg_try_advisory_lock(20); --> true

Я ожидал, что вторая команда должна вернуть false, так как блокировка уже должна была быть получена. Как ни странно, я получаю следующее, предполагая, что замок был приобретен дважды:

SELECT pg_advisory_unlock(20); --> true
SELECT pg_advisory_unlock(20); --> true
SELECT pg_advisory_unlock(20); --> false

Итак, я думаю, мой вопрос в том, как это сделать приобрести консультативную блокировку таким образом, чтобы она не приобреталась снова?

2 ответов


Что, если вы попытаетесь сделать это из 2 разных сеансов PostgreSQL?

узнайте больше в документах.


мое первое впечатление от консультативных замков было похоже. Я ожидал, что второй запрос (выберите pg_tryadvisory_lock (20)) также вернет false (потому что первый получил блокировку). Но этот запрос только подтвердил, что bigInt со значением 20 имеет блокировку. Интерпретация зависит от пользователя.

представьте себе консультативные блокировки как таблицу, в которой вы можете сохранить значение и получить блокировку этого значения (обычно BigInt). Это не явная блокировка, и никакая транскрипция не будет отложена. Это зависит от тебя. как интерпретировать и использовать результат-и это не блокирует.

Я использую его в своих проектах с двумя целыми числами-options. Выберите pg_try_advisory_lock (classId, objId), тогда как оба параметра являются целыми числами.

чтобы он работал с более чем таблицей, просто используйте OID таблицы как classId и основной id (здесь 17) как objId:

SELECT pg_try_advisory_lock((SELECT 'first_table'::regclass::oid)::integer, 17);

в этом примере "first_table" - это имя таблицы, а второе целое число-идентификатор первичного ключа (здесь: 17).

использование bigInt в качестве параметра позволяет более широкий диапазон идентификаторов, но если вы используете его с "second_table", чем идентификатор 17, также заблокирован (потому что вы заблокировали число "17", а не отношение к определенной строке в таблице).

Мне потребовалось некоторое время, чтобы понять это, поэтому, надеюсь, это поможет понять внутреннюю работу консультативных замков.