Instrução LOCK TABLE

Permite ao usuário obter explicitamente um bloqueio de tabela, exclusivo ou compartilhado, na tabela especificada. O bloqueio da tabela permanece até o término da transação corrente.

O bloqueio explícito da tabela é útil para:
  • evitar a sobrecarga devido a vários bloqueios na tabela (em outras palavras, escalada de bloqueio iniciada pelo usuário)
  • evitar impasses (deadlocks)

Não é possível bloquear tabelas do sistema com esta instrução.

Sintaxe

LOCK TABLE nome-da-tabela IN { SHARE | EXCLUSIVE } MODE

Uma vez que alguma tabela esteja bloqueada em um dos modos, a transação não obterá bloqueios subseqüentes no nível-de-linha. Por exemplo, se uma transação bloquear toda a tabela VÔOS no modo compartilhado para ler os dados, e uma determinada instrução desta transação necessitar bloquear uma determinada linha no modo exclusivo para poder atualizar a linha, o bloqueio anterior no nível-de-tabela força o bloqueio no modo exclusivo ser no nível-de-tabela também.

Se o bloqueio especificado não puder ser obtido porque outra conexão já possui um bloqueio na tabela, será lançada uma excessão no nível-de-instrução (SQLState X0X02) após ser esgotado o tempo limite de impasse.

-- bloquear toda a tabela no modo compartilhado
-- para evitar um número grande de bloqueios de linha
LOCK TABLE VÔOS IN SHARE MODE;

SELECT *
FROM VÔOS
WHERE AEROPORTO_ORIGEM > 'OOO';

-- bloquear toda a tabela no modo exclusivo
-- para uma transação que irá atualizar muitas linhas,
-- mas onde nenhuma instrução atualizará isoladamente um
-- número suficiente de linhas para obter um bloqueio
-- da tabela no modo exclusivo.
-- No sistema de bloqueio no nível-de-linha, a transação
-- iria requerer um número grande de bloqueios e poderia
-- causar um impasse.
LOCK TABLE DISPONIBILIDADE_HOTEL IN EXCLUSIVE MODE;

UPDATE DISPONIBILIDADE_HOTEL
SET QUARTOS_RESERVADOS = (QUARTOS_RESERVADOS + 2)
WHERE ID_HOTEL = 194 AND DATA_DE_RESERVA = DATE('1998-04-10');

UPDATE DISPONIBILIDADE_HOTEL
SET QUARTOS_RESERVADOS = (QUARTOS_RESERVADOS + 2)
WHERE ID_HOTEL = 194 AND DATA_DE_RESERVA = DATE('1998-04-11');

UPDATE DISPONIBILIDADE_HOTEL
SET QUARTOS_RESERVADOS = (QUARTOS_RESERVADOS + 2)
WHERE ID_HOTEL = 194 AND DATA_DE_RESERVA = DATE('1998-04-12');

UPDATE DISPONIBILIDADE_HOTEL
SET QUARTOS_RESERVADOS = (QUARTOS_RESERVADOS + 2)
WHERE ID_HOTEL = 194 AND DATA_DE_RESERVA = DATE('1998-04-12');

-- se a transação necessitar bloquear a tabela antes de
-- atualizá-la, deverá obter um bloqueio exclusivo antes
-- de selecionar para evitar impasses.
LOCK TABLE PESSOAS IN EXCLUSIVE MODE;

SELECT MAX(ID_PESSOA) + 1 FROM PESSOAS;
-- INSERT INTO PESSOAS . . .
Conceitos relacionados
Interação com o sistema de dependências
Instruções CREATE
Instruções DROP
Instruções RENAME
Instruções SET
Referências relacionadas
Instrução ALTER TABLE
CALL (PROCEDIMENTO)
Cláusula CONSTRAINT
Instrução DECLARE GLOBAL TEMPORARY TABLE
Instrução DELETE
Cláusula FOR UPDATE
Cláusula FROM
Cláusula GROUP BY
Cláusula HAVING
INNER JOIN
Instrução INSERT
Operação JOIN
LEFT OUTER JOIN
Cláusula ORDER BY
Consulta
RIGHT OUTER JOIN
SubconsultaEscalar
ExpressãoSeleção
Instrução SELECT
ExpressãoTabela
SubconsultaTabela
Instrução UPDATE
VALUES Expressão
Cláusula WHERE
Cláusula WHERE CURRENT OF