sql >> Database >  >> RDS >> PostgreSQL

Een specifieke rij vergrendelen in postgres

Als u de tabel in een specifiek geselecteerde rij wilt vergrendelen, moet u LOCK FIRST ze gebruiken de FOR UPDATE / FOR SHARE statement.Als u bijvoorbeeld de eerste rij moet vergrendelen, doet u dit:

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;

In het BLOCK1 voor de SELECT statement dat je niets doet, alleen de database vertellen "Hé, ik zal iets in deze tabel doen, dus als ik dat doe, vergrendel deze tabel dan in deze modus". U kunt elke rij selecteren / bijwerken / verwijderen.

Maar in BLOCK2 wanneer u de FOR UPDATE . gebruikt je vergrendelt die rij voor andere transacties op specifieke modi (lees de doc voor meer details). Wordt vergrendeld totdat die transactie eindigt.

Als je een voorbeeld nodig hebt, doe dan een test en probeer nog een SELECT ... FOR UPDATE in BLOCK2 voor het einde van de eerste transactie. Het wacht tot de eerste transactie is afgelopen en selecteert direct daarna.

Ik gebruik het in een functie om subreeksen te besturen en het is geweldig. Ik hoop dat je geniet.



  1. FRM-50026 datum moet worden ingevoerd in een formaat zoals DD-MON-YYYY

  2. PostgreSQL bigserial &nextval

  3. Waarom kan NULL in SQL niet overeenkomen met NULL?

  4. Het optimaliseren van een SELECT-query die langzaam draait op Oracle die snel draait op SQL Server