Não.
PARA ATUALIZAÇÃO
bloqueia apenas essas linhas , para que outra transação que tente bloqueá-los (com FOR SHARE
, PARA ATUALIZAÇÃO
, ATUALIZAR
ou EXCLUIR
) bloqueia até que sua transação seja confirmada ou revertida. Se você quiser um bloqueio de tabela inteiro que bloqueie inserções/atualizações/exclusões, você provavelmente deseja
LOCK TABLE ... IN EXCLUSIVE MODE
. -
Consulte olock_timeout configuração
. Isso foi adicionado em 9.3 e não está disponível em versões mais antigas.
Aproximações brutas para versões mais antigas podem ser obtidas comstatement_timeout
, mas isso pode fazer com que as instruções sejam canceladas desnecessariamente. Sestatement_timeout
é 1s e uma instrução espera 950ms em um bloqueio, ele pode então obter o bloqueio e prosseguir, apenas para ser imediatamente cancelado por um tempo limite. Não o que você quer.
Não há maneira de definir o nível de consultalock_timeout
, mas você pode e deve apenas:
SET LOCAL lock_timeout ='1s';
depois deCOMEÇAR
uma transação.
-
Há uma declaração tempo limite, mas os bloqueios são mantidos na transação nível. Não há recurso de tempo limite de transação.
Se você estiver executando transações de instrução única, basta definir umstatement_timeout
antes de executar a instrução para limitar por quanto tempo ela pode ser executada. No entanto, isso não é a mesma coisa que limitar por quanto tempo ele pode manter um bloqueio, porque pode esperar 900ms de 1s permitidos para o bloqueio, apenas manter o bloqueio por 100ms e ser cancelado pelo tempo limite.
-
Não. Você deve:
BEGIN; SET LOCAL lock_timeout = '4s'; SELECT ....; COMMIT;
-
DEFINIR LOCAL
é adequado e preferido para isso.
Não há como fazer isso no texto da consulta, deve ser uma instrução separada.
A postagem da lista de discussão à qual você vinculou é uma proposta para uma sintaxe imaginária que nunca foi implementada (pelo menos em uma versão pública do PostgreSQL) e não existe.
Em uma situação como essa, você pode considerar o "controle de simultaneidade otimista", geralmente chamado de "bloqueio otimista". Ele oferece maior controle sobre o comportamento de bloqueio ao custo de taxas aumentadas de repetição de consulta e a necessidade de mais lógica de aplicativo.