Categorias:

Sintaxe de consulta

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> ]
Copy

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:

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.

  1. A consulta a seguir é executada na transação T1:

    SELECT * FROM T WHERE ID < 20 FOR UPDATE;
    
    Copy

    A consulta retorna os valores 5 e 10 e bloqueia essas duas linhas.

  2. Outra transação, T2, executa a seguinte operação DELETE:

    DELETE FROM T WHERE ID = 5;
    
    Copy

    A transação T2 tem que esperar até T1 ser concluído (isto é, até que seja confirmado ou revertido).

  3. No entanto, uma terceira transação, T3, pode completar a seguinte operação INSERT:

    INSERT INTO T VALUES 12;
    
    Copy
  4. Uma consulta subsequente em T1 agora retorna três valores (linhas), não dois: 5, 10 e 12:

    SELECT * FROM T WHERE ID < 20;
    
    Copy

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;
Copy

Aplique um tempo máximo de espera de 60 segundos para bloqueio de linha:

BEGIN;
...
SELECT * FROM ht FOR UPDATE WAIT 60;
...
COMMIT;
Copy