PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Blokowanie określonego wiersza w postgresie

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Problem z accepts_nested_attributes_for w Railsach 5.0.0.beta3, opcja -api

  2. pg_stat_activity - jak zobaczyć bieżącą aktywność wewnątrz uruchomionej procedury składowanej

  3. Spłaszczanie kolumny Postgres zagnieżdżonej JSONB

  4. Kodowanie znaków (UTF-8) w sesji PowerShell

  5. Ograniczenie wyzwalania a sprawdzanie