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

Bloqueie para SELECT para que outro processo não obtenha dados antigos


Sua pergunta, referenciando uma fonte desconhecida:

Eu olhei para o bloqueio de linha, mas ele diz que você não pode impedir instruções de seleção que parecem não funcionar para minha condição aqui. Minha única opção é usar bloqueios consultivos?

A documentação oficial sobre o assunto:

Os bloqueios em nível de linha não afetam a consulta de dados; eles bloqueiam apenas escritores e armários para a mesma fila.

Tentativas simultâneas não apenas selecionarão, mas tentarão remover o mesmo bloqueio em nível de linha com SELECT ... FOR UPDATE - o que faz com que eles esperem por qualquer transação anterior que mantenha um bloqueio na mesma linha para confirmar ou reverter. Apenas o que você queria.

No entanto , muitos casos de uso são melhor resolvidos com bloqueios consultivos - em versões anteriores a 9.5. Você ainda pode bloquear linhas sendo processadas com FOR UPDATE adicionalmente para ser seguro. Mas se a próxima transação quiser apenas processar "a próxima linha livre", geralmente é muito mais eficiente não esperar pela mesma linha, que é quase certamente indisponível após a liberação do bloqueio, mas pule para o "próximo livre" imediatamente.

No Postgres 9.5+ considere FOR UPDATE SKIP LOCKED por esta. Como @Craig comentou, isso pode substituir amplamente os bloqueios consultivos.

Pergunta relacionada tropeçando no mesmo desempenho:
  • Função demorando uma eternidade para ser executada para um grande número de registros

Explicação e exemplo de código para bloqueios consultivos ou FOR UPDATE SKIP LOCKED no Postgres 9.5+:
  • Postgres UPDATE ... LIMIT 1

Para bloquear muitas linhas de uma vez :
  • Como marcar certo número de linhas na tabela em acesso simultâneo