PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Blocco di una riga specifica in postgres

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.