Jeśli chcesz zablokować tabelę w konkretnym wybranym wierszu, musisz LOCK FIRST
używają FOR UPDATE / FOR SHARE
oświadczenie.Na przykład, jeśli chcesz zablokować pierwszy wiersz, zrób tak:
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;
W BLOCK1
przed SELECT
stwierdzenie nic nie robisz tylko mówisz do bazy danych "Hej, zrobię coś w tej tabeli, więc jak to zrobię, zablokuj tę tabelę w tym trybie". Możesz wybrać / zaktualizować / usunąć dowolny wiersz.
Ale w BLOCK2
gdy używasz FOR UPDATE
blokujesz ten wiersz dla innych transakcji w określonych trybach (przeczytaj dokument po więcej szczegółów). Zostanie zablokowana do czasu zakończenia transakcji.
Jeśli potrzebujesz przykładu, wykonaj test i spróbuj wykonać kolejny SELECT ... FOR UPDATE
w BLOCK2
przed zakończeniem pierwszej transakcji. Będzie czekał na zakończenie pierwszej transakcji i dokona wyboru zaraz po niej.
Używam go w funkcji do kontrolowania podsekwencji i jest świetny. Mam nadzieję, że Ci się spodoba.