É possível escrever uma UPDATE
consulta que simplesmente será encerrada se o registro que ela tentar alterar estiver bloqueado por outro processo (em vez de aguardar a liberação do bloqueio)?
Tenho um processo que deveria atualizar os registros em uma tabela, de vez em quando esses registros ficam bloqueados. A atualização desses registros é desejável, mas não essencial. Se os registros estiverem em uso, prefiro que meu processo simplesmente esqueça a atualização e passe para algo mais importante.
Minha abordagem atual é definir o tempo limite do comando para 1 segundo, mas mesmo isso é mais longo do que eu gostaria de esperar - uma atualização normal leva uma fração de milissegundo, portanto, esperar um segundo é uma grande sobrecarga.
Você pode bloquear a linha manualmente antes de fazer a atualização usando:
Isso lançará um erro se o bloqueio não puder ser obtido.
SKIP LOCKED
pode atendê-lo melhor.O manual:
No seu caso, o
SELECT
filtro filtra exatamente uma linha . Se estiver bloqueado, é ignorado e nada acontece.A diferença essencial para
NOWAIT
: nenhum erro é gerado, a operação é ignorada silenciosamente. Isso é provavelmente melhor para o seu caso.Você também pode atualizar várias linhas dessa maneira (com
IN
em vez de=
). Todas as linhas bloqueadas são ignoradas, o restante é atualizado. ComNO WAIT
, o todoUPDATE
seria impedido pelo erro gerado. (E toda a transação foi revertida, a menos que você capture a exceção.)Relacionado: