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.