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

Zablokuj na SELECT, aby inny proces nie otrzymał starych danych

Twoje pytanie, odwołujące się do nieznanego źródła:

Przyjrzałem się blokowaniu wierszy, ale mówi, że nie możesz zapobiec wyrażeniom select, które brzmią tak, jakby nie działały tutaj dla mojego warunku. Czy mogę używać tylko doradczych blokad?

Oficjalna dokumentacja w tej sprawie:

Blokady na poziomie wiersza nie wpływają na zapytania o dane; blokują tylko pisarzy i szafki do tego samego rzędu.

Jednoczesne próby nie tylko wybiorą, ale spróbują usunąć tę samą blokadę na poziomie wiersza za pomocą SELECT ... FOR UPDATE - co powoduje, że czekają na każdą poprzednią transakcję trzymającą blokadę w tym samym wierszu, aby zatwierdzić lub wycofać. Dokładnie to, czego chciałeś.

Jednak , wiele przypadków użycia można lepiej rozwiązać za pomocą blokad doradczych - w wersjach przed 9.5. Nadal możesz zablokować przetwarzane wiersze za pomocą FOR UPDATE dodatkowo być bezpiecznym. Ale jeśli następna transakcja chce tylko przetworzyć „następny wolny wiersz”, często jest to dużo wydajniej nie czekać na ten sam wiersz, który prawie na pewno jest niedostępny po zwolnieniu blokady, ale natychmiast przejść do „następnego wolnego”.

W Postgresie 9.5+ rozważ FOR UPDATE SKIP LOCKED dla tego. Jak skomentował @Craig, może to w dużej mierze zastąpić blokady doradcze.

Powiązane pytanie natykające się na tego samego wieprza wydajności:

  • Funkcja, która trwa wiecznie dla dużej liczby rekordów

Wyjaśnienie i przykład kodu dla blokad doradczych lub FOR UPDATE SKIP LOCKED w Postgresie 9.5+:

  • AKTUALIZACJA Postgresa... LIMIT 1

Aby zablokować wiele wierszy naraz :

  • Jak zaznaczyć określoną liczbę wierszy w tabeli przy jednoczesnym dostępie


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Uzyskaj wszystkie rekordy starsze niż 30 dni

  2. MySQL a PostgreSQL dla aplikacji internetowych

  3. Projekt tymczasowej bazy danych z niespodzianką (wiersze na żywo a wiersze robocze)

  4. Błąd PostgreSQL „Nie można połączyć się z serwerem:Brak takiego pliku lub katalogu”

  5. PostgreSQL Warunek „Gdzie liczyć”