Hvis du vil låse tabellen i en bestemt udvalgt række, skal du LÅS FØRST
de bruger TIL OPDATERING / TIL DEL
For eksempel, i dit tilfælde, hvis du skal låse den første række, gør du dette:
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ør SELECT
udsagn, du gør ingenting, kun fortæller databasen "Hej, jeg vil gøre noget i denne tabel, så når jeg gør det, så lås denne tabel i denne tilstand". Du kan vælge / opdatere / slette enhver række.
Men i BLOCK2
når du bruger
Hvis du har brug for et eksempel, lav en test og prøv at lave en anden SELECT ... FOR UPDATE
i BLOCK2
inden den første transaktion afsluttes. Den venter på, at den første transaktion afsluttes og vælger lige efter den.
Jeg bruger det i en funktion til at styre undersekvenser, og det er fantastisk. Håber du nyder det.