- Categorias:
FOR UPDATE¶
Bloqueia as linhas que a consulta seleciona até que a transação que contém a consulta seja confirmada ou abortada.
Esta cláusula é suportada para uso somente com tabelas híbridas e é útil para cargas de trabalho transacionais nas quais várias transações tentam acessar as mesmas linhas ao mesmo tempo. As linhas são bloqueadas para atualização no sentido de que outras transações não podem gravar dados nessas linhas até que a transação que está fazendo o bloqueio tenha sido totalmente confirmada ou revertida. No entanto, outras transações podem ler as linhas bloqueadas, e outras linhas na mesma tabela podem ser lidas, atualizadas ou excluídas.
SELECT ...
FROM ...
[ ... ]
FOR UPDATE [ NOWAIT | WAIT <wait_time> ]
Parâmetros¶
NOWAIT
Retorna um erro se a transação não puder bloquear as linhas selecionadas imediatamente. NOWAIT é o padrão.
WAIT wait_time
Especifica o tempo máximo (em segundos) que a consulta aguarda para adquirir bloqueios em nível de linha. Se o tempo de espera expirar, a consulta retornará um erro.
Restrições¶
A cláusula FOR UPDATE:
Não pode ser usado com transações AUTOCOMMIT.
Deve ser a última cláusula na instrução SELECT.
Não pode ser usado em uma instrução CTAS.
Não pode ser usado dentro de subconsultas.
Não é possível selecionar entre várias tabelas (junções) ou operações de definição.
Não pode ser usado quando a consulta contém:
Notas de uso¶
Porque as tabelas híbridas oferecem suporte ao nível de isolamento READ COMMITTED, as cláusulas FOR UPDATE não garantem estabilidade de leitura. Por exemplo, suponha que uma tabela T
com uma única coluna chamada ID
contenha duas linhas com valores 5
e 10
.
A consulta a seguir é executada na transação
T1
:SELECT * FROM T WHERE ID < 20 FOR UPDATE;
A consulta retorna os valores
5
e10
e bloqueia essas duas linhas.Outra transação,
T2
, executa a seguinte operação DELETE:DELETE FROM T WHERE ID = 5;
A transação
T2
tem que esperar atéT1
ser concluído (isto é, até que seja confirmado ou revertido).No entanto, uma terceira transação,
T3
, pode completar a seguinte operação INSERT:INSERT INTO T VALUES 12;
Uma consulta subsequente em
T1
agora retorna três valores (linhas), não dois:5
,10
e12
:SELECT * FROM T WHERE ID < 20;
Exemplos¶
Abra uma nova transação, selecione todas as linhas de uma tabela híbrida (ht
) e bloqueie essas linhas até que a transação seja confirmada. Atualize algumas linhas selecionadas e execute outra consulta antes de confirmar a transação.
BEGIN;
...
SELECT * FROM ht ORDER BY c1 FOR UPDATE;
...
UPDATE ht set c1 = c1 + 10 WHERE c1 = 0;
...
SELECT ... ;
...
COMMIT;
Aplique um tempo máximo de espera de 60 segundos para bloqueio de linha:
BEGIN;
...
SELECT * FROM ht FOR UPDATE WAIT 60;
...
COMMIT;