Instrução LOCK TABLE Instrução LOCK TABLE Tabelasbloqueio Escalada de bloqueiopelo usuário

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 . . .