PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Bloqueando uma linha específica no postgres


Se você deseja bloquear a tabela em uma linha selecionada específica, você precisa LOCK FIRST eles usam o FOR UPDATE / FOR SHARE Por exemplo, no seu caso, se você precisar bloquear a primeira linha, faça isso:
BEGIN;

LOCK TABLE person IN ROW EXCLUSIVE MODE;

-- BLOCK 1

SELECT * FROM person WHERE name = 'John' and money = 1 FOR UPDATE;

-- BLOCK 2

UPDATE person set name = 'John 2' WHERE name = 'John' and money = 1;

END;

No BLOCK1 antes do SELECT declaração você não está fazendo nada apenas dizendo ao banco de dados "Ei, vou fazer algo nesta tabela, então quando eu fizer, bloqueie esta tabela neste modo". Você pode selecionar / atualizar / excluir qualquer linha.

Mas em BLOCK2 quando você usa o FOR UPDATE você bloqueia essa linha para outras transações em modos específicos (leia o doc para mais detalhes). Será bloqueado até que a transação termine.

Se precisar de um exemplo faça um teste e tente fazer outro SELECT ... FOR UPDATE em BLOCK2 antes de finalizar a primeira transação. Ele estará esperando a primeira transação terminar e selecionará logo após.

Estou usando em uma função para controlar subsequências e está ótimo. Espero que goste.