Bloqueios são feitos durante (geralmente no início ou próximo ao início) da execução de um comando. Bloqueios (exceto bloqueios consultivos) são liberados somente quando uma transação é confirmada ou revertida. Não há
FOR UNLOCK
, nem há um UNLOCK
comando para reverter os efeitos do LOCK
no nível da tabela comando. Tudo isso é explicado na seção de controle de simultaneidade da documentação do PostgreSQL. Você deve confirmar ou reverter sua transação para liberar bloqueios.
Além disso, não faz sentido perguntar "essa linha já foi excluída por outra transação simultânea". Ele não é realmente excluído até que a transação que excluiu a linha seja confirmada... e mesmo assim, ela pode ter excluído e reinserido a linha ou outra transação simultânea pode ter inserido a linha novamente.
Você está construindo uma fila de tarefas ou um sistema de fila de mensagens por acaso, porque nesse caso, esse problema está resolvido e você não deveria estar tentando reinventar essa roda incomumente complicada. Veja PGQ, ActiveMQ, RabbitMQ, ZeroMQ, etc. (Versões futuras do PostgreSQL podem incluir
FOR UPDATE SKIP LOCKED
já que isso está sendo testado, mas não foi lançado no momento da escrita). Sugiro que você poste uma nova pergunta com uma descrição mais detalhada do problema subjacente que você está tentando resolver. Você está assumindo que a solução para o seu problema é "descobrir se a linha já foi excluída" ou "desbloquear a linha". Isso provavelmente não é realmente a solução. É um pouco como alguém dizendo "onde compro gasolina" quando sua bicicleta não anda, então eles assumem que está sem combustível. Combustível não é o problema, o problema é que as bicicletas de empurrar não consomem combustível e você tem que pedalá-las.
Explique o fundo. Explique o que você está tentando alcançar. Acima de tudo, não poste pseudocódigo, poste o código real com o qual você está tendo problemas , de preferência em uma forma independente e executável.