The following query returns and locks 1 row as expected (only one row in pg_locks with locktype='advisory' and objid=sequence_id):
begin;select qe.entity_id, qe.version, qe.queue_id, qe.sequence_id, qe.tx_id
from origo_queue_entry qe
WHERE
qe.queue_id = (SELECT q.entity_id FROM origo_queue q WHERE q.name = 'EMAIL_IMPORT_STORE') AND pg_try_advisory_xact_lock(sequence_id)
ORDER BY qe.sequence_id ASC
LIMIT 1 FOR UPDATE
;
But when JOIN'ing with origo_queue instead of using a sub-query:
begin;select qe.entity_id, qe.version, qe.queue_id, qe.sequence_id, qe.tx_id
from origo_queue_entry qe JOIN origo_queue q ON q.entity_id = qe.queue_id
WHERE
q.name = 'EMAIL_IMPORT_STORE'
AND pg_try_advisory_xact_lock(sequence_id)
ORDER BY qe.sequence_id ASC
LIMIT 1 FOR UPDATE
;
it returns 1 row, but locks all of them; pg_locks is now full af advisory-locks for all "sequence_id" in origo_queue_entry
Сайт использует файлы cookie для корректной работы и повышения удобства. Нажимая кнопку «Принять» или продолжая пользоваться сайтом, вы соглашаетесь на их использование в соответствии с Политикой в отношении обработки cookie ООО «ППГ», в том числе на передачу данных из файлов cookie сторонним статистическим и рекламным службам. Вы можете управлять настройками cookie через параметры вашего браузера