Я не думаю, что это возможно.Вы не можете заблокировать доступ к таблице только для чтения (если только выбор не сделан FOR UPDATE
)
Насколько я могу судить, единственный шанс, который у вас есть, - использовать функцию pg_advisory_lock()
.http://www.postgresql.org/docs/current/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
Но для этого требуется «ручное» снятие замков, полученных через него.Вы не получите автоматическую разблокировку с этим.
Для блокировки строк вам понадобится что-то вроде этого:
select pg_advisory_lock(id), *
from
(
select * table1 order by id limit 5
) t
(Обратите внимание на использование производной таблицы для части LIMIT.См. Ссылку на руководство, которую я разместил для объяснения)
Затем вам нужно сохранить полученные идентификаторы, а затем позвонить pg_advisory_unlock()
для каждого идентификатора.
Если каждый процесс всегда выпускает все идентификаторы одновременно, вы можете просто использовать pg_advisory_unlock_all()
вместо этого.Тогда вам не нужно будет сохранять полученные идентификаторы.
Обратите внимание, что это не не позволит другим читать строки, используя «обычные» операции выбора.Это будет работать, только если каждый процесс, который обращается к этой таблице, использует один и тот же шаблон получения блокировок.