Se vuoi bloccare la tabella in una specifica riga selezionata devi LOCK FIRST
usano il FOR UPDATE / FOR SHARE
statement.Ad esempio, nel tuo caso se devi bloccare la prima riga, fai così:
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;
Nel BLOCK1
prima del SELECT
dichiarazione non stai facendo nulla solo dicendo al database "Ehi, farò qualcosa in questa tabella, quindi quando lo farò, blocca questa tabella in questa modalità". Puoi selezionare/aggiornare/eliminare qualsiasi riga.
Ma in BLOCK2
quando usi il FOR UPDATE
blocchi quella riga su altre transazioni in modalità specifiche (leggi il doc per ulteriori dettagli). Sarà bloccato fino al termine della transazione.
Se hai bisogno di un esempio fai un test e prova a fare un altro SELECT ... FOR UPDATE
in BLOCK2
prima di concludere la prima transazione. Attenderà la fine della prima transazione e selezionerà subito dopo.
Lo sto usando in una funzione per controllare le sottosequenze ed è fantastico. Spero ti piaccia.