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