sql >> Databáze >  >> RDS >> PostgreSQL

Uzamčení konkrétního řádku v postgresu

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.



  1. Odstranit řádek v mysql a přidružený ze složky

  2. Jak určit `pořadí podle` na nejednoznačném sloupci pomocí jarní dávky a postgres?

  3. Jak mohu použít kaskádové mazání se serverem SQL?

  4. vyberte, když se poprvé objeví tři jedinečné hodnoty s sql