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.