Насколько я понял, вы пытаетесь получить рекомендательную блокировку для первой строки, которая не была помечена рекомендательной блокировкой.
Редактировать: после попытки этого pg_try_advisory_lock () во внутреннем select, по-видимому, не работает (следовало подумать об этом ранее).Но простое исключение всех строк из таблицы с помощью проверки objid должно работать:
select pg_try_advisory_lock(id), *
from
(
select id,val
from test
where id not in (select objid from pg_locks where locktype = 'advisory')
order by id limit 1
) t
Редактировать
Хотя в pg_locks будут отображаться консультативные блокировки, они никогда не будут иметь никакихинформация о таблице или строке, которая была заблокирована.В конце концов, pg_advisory_lock () просто передается число, которое не имеет связи с базовой таблицей или строкой.
SELECT pg_advisory_lock(42)
создаст точно такую же консультативную блокировку, что и
SELECT pg_advisory_lock(id)
FROM foo
WHERE id = 42
Так что ваше объединение с использованием classid никогда не будет успешным.