sql >> Databasteknik >  >> RDS >> PostgreSQL

Låsa en specifik rad i postgres

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.



  1. Hur får man en radrankning?

  2. Hur man ändrar befintliga tabeller för tidszonstillägg

  3. Använd accentkänslig primärnyckel i MySQL

  4. Konvertera text till Varchar