English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Lock (Trava) PostgreSQL

Os locks são principalmente para manter a consistência dos dados do banco de dados, podem evitar que os usuários modificem uma linha ou toda a tabela, geralmente usados em bancos de dados com alto grau de concorrência.

Quando vários usuários acessam o banco de dados ao mesmo tempo, se as operações concorrentes não forem controladas, pode haver leitura e armazenamento de dados incorretos, destruindo a consistência do banco de dados.

Existem dois tipos básicos de locks no banco de dados: locks exclusivos (Exclusive Locks) e locks de compartilhamento (Share Locks).

Se o objeto de dados for adicionado um lock exclusivo, outras transações não poderão lê-lo e modificá-lo.

Se adicionado um lock de compartilhamento, o objeto do banco de dados pode ser lido por outras transações, mas não pode ser modificado.

Sintaxe do comando LOCK

A sintaxe básica do comando LOCK é a seguinte:

LOCK [ TABLE ]
name
 IN
lock_mode
  • name: O nome da tabela existente a ser bloqueada (opcional com especificação de modo). Se for especificado apenas antes do nome da tabela, será bloqueada apenas essa tabela. Se não for especificado, será bloqueada essa tabela e todas as suas subtabelas (se houver).

  • lock_mode: O modo de bloqueio especifica qual trava conflita com esta trava. Se não for especificado o modo de bloqueio, será usado o modo de exclusão de acesso limitado mais restritivo. Os valores possíveis são: ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE.

Uma vez obtido o bloqueio, ele será mantido até o resto da transação atual. Não há comando de desbloqueio da tabela; os bloqueios são sempre liberados no final da transação.

Deadlock

Pode ocorrer um deadlock quando duas transações esperam umas as outras para completar suas operações. Embora o PostgreSQL possa detectá-las e encerrá-las com rollback, o deadlock ainda é muito incômodo. Para evitar que o aplicativo encontre esse problema, certifique-se de que o aplicativo seja projetado para bloquear objetos em uma ordem idêntica.

Bloqueio consultivo

O PostgreSQL oferece métodos para criar bloqueios com significado definido pelo aplicativo. Esses são chamados de bloqueios consultivos. Como o sistema não obriga o uso deles, a utilização correta depende do aplicativo. Os bloqueios consultivos são muito úteis para estratégias de bloqueio que não se encaixam no modelo MVCC.

Por exemplo, um uso comum da consulta de bloqueio é simular a estratégia de bloqueio pessimista típica de um sistema de gerenciamento de dados de "arquivo plano". Embora o sinal armazenado na tabela possa ser usado para o mesmo propósito, a notificação de bloqueio é mais rápida, evita a inflação da tabela e é limpa automaticamente pelo servidor no final da sessão.

Exemplo online

Criar tabela COMPANY (Download arquivo SQL da tabela COMPANY ),os dados são os seguintes:

w3codeboxdb# select * from COMPANY;
 id | name | age | address | salary
----+-------+-----+-----------+--------
  1 | Paul |  32 | California|  20000
  2 | Allen |  25 | Texas |  15000
  3 | Teddy |  23 | Norway |  20000
  4 | Mark |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas |  85000
  6 | Kim |  22 | South-Hall|  45000
  7 | James |  24 | Houston |  10000
(7 rows)

O exemplo a seguir mostrará w3A tabela COMPANY no banco de dados codeboxdb está bloqueada no modo ACCESS EXCLUSIVE.

A declaração LOCK só funciona em modo de transação.

w3codeboxdb=#BEGIN;
LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;

A operação acima resultará no seguinte:

LOCK TABLE

A mensagem acima indica que a tabela está bloqueada até o fim da transação e para completar a transação, você deve rollback ou commit a transação.