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