Pokud chcete uzamknout tabulku v konkrétním vybraném řádku, musíte LOCK FIRST
používají FOR UPDATE / FOR SHARE
Například ve vašem případě, pokud potřebujete zamknout první řádek, udělejte toto:
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;
V BLOCK1
před SELECT
prohlášení neděláte nic, pouze říkáte databázi "Hej, udělám něco v této tabulce, takže když to udělám, uzamkněte tuto tabulku v tomto režimu". Můžete vybrat / aktualizovat / smazat libovolný řádek.
Ale v BLOCK2
když použijete FOR UPDATE
uzamknete tento řádek pro jiné transakce do konkrétních režimů (přečtěte si doc Více podrobností). Bude uzamčena, dokud transakce neskončí.
Pokud potřebujete příklad, udělejte test a zkuste provést další SELECT ... FOR UPDATE
v BLOCK2
před ukončením první transakce. Bude čekat na ukončení první transakce a vybere se hned po ní.
Používám to ve funkci pro ovládání subsekvencí a je to skvělé. Doufám, že se vám bude líbit.