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

Låsning af en bestemt række i postgres

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 TIL OPDATERING du låser den række til andre transaktioner til specifikke tilstande (læs doc for flere detaljer). Vil være låst, indtil transaktionen slutter.

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.



  1. Spring JdbcTemplate opdatering Postgis geografi kolonne

  2. i mysql, på delete cascade virker ikke

  3. Integriteten af ​​min transaktion går tabt med TransactionInDoubtException undtagelse

  4. Hvordan gemmer man en datatabel i databasen?