PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

bloqueie as linhas até o próximo postgres selecione


Eu não acho que isso seja possível. Você não pode bloquear um acesso somente leitura a uma tabela (a menos que a seleção seja feita FOR UPDATE )

Até onde eu sei, a única chance que você tem é usar o pg_advisory_lock() função.
http://www .postgresql.org/docs/current/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS

Mas isso requer uma liberação "manual" das fechaduras obtidas por meio dele. Você não terá um desbloqueio automático com isso.

Para bloquear as linhas, você precisaria de algo assim:
select pg_advisory_lock(id), * 
from 
( 
  select * table1 order by id limit 5
) t

(Observe o uso da tabela derivada para a parte LIMIT. Veja o link do manual que postei para uma explicação)

Então você precisa armazenar os IDs recuperados e depois chamar pg_advisory_unlock() para cada ID.


Se cada processo está sempre liberando todos IDs de uma só vez, você pode simplesmente usar pg_advisory_unlock_all() em vez de. Então você não precisará armazenar os IDs recuperados.

Observe que isso não impedir que outros leiam as linhas usando seleções "normais". Só funcionará se todo processo que acessar essa tabela utilizar o mesmo padrão de obtenção dos bloqueios.