Om du vill låsa tabellen i en specifik vald rad måste du LOCK FIRST
de använder FOR UPDATE / FOR SHARE
Till exempel, i ditt fall om du behöver låsa den första raden gör du så här:
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;
I BLOCK1
före SELECT
uttalande du gör ingenting bara säger till databasen "Hej, jag kommer att göra något i den här tabellen, så när jag gör det, lås den här tabellen i det här läget". Du kan välja / uppdatera / ta bort valfri rad.
Men i BLOCK2
när du använder FOR UPDATE
du låser den raden till andra transaktioner till specifika lägen (läs doc för mer detaljer). Kommer att vara låst tills den transaktionen avslutas.
Om du behöver ett exempel gör ett test och försök göra en annan SELECT ... FOR UPDATE
i BLOCK2
innan den första transaktionen avslutas. Den väntar på att den första transaktionen ska avslutas och kommer att väljas direkt efter den.
Jag använder det i en funktion för att styra undersekvenser och det är jättebra. Hoppas du njuter.