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

zablokuj wiersze do następnego wyboru postgres

Nie sądzę, żeby to było możliwe. Nie możesz zablokować dostępu tylko do odczytu do tabeli (chyba że zaznaczenie zostało wykonane FOR UPDATE )

O ile wiem, jedyną szansą, jaką masz, jest użycie pg_advisory_lock() funkcjonować.
http://www .postgresql.org/docs/current/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS

Wymaga to jednak „ręcznego” zwolnienia uzyskanych dzięki nim zamków. Dzięki temu nie otrzymasz automatycznego odblokowania.

Aby zablokować wiersze, potrzebujesz czegoś takiego:

select pg_advisory_lock(id), * 
from 
( 
  select * table1 order by id limit 5
) t

(Zwróć uwagę na użycie tabeli pochodnej dla części LIMIT. Zobacz link do podręcznika, który opublikowałem, aby uzyskać wyjaśnienie)

Następnie musisz zapisać pobrane identyfikatory, a później wywołać pg_advisory_unlock() dla każdego identyfikatora.

Jeśli każdy proces zawsze zwalnia wszystkie Identyfikatory na raz, możesz po prostu użyć pg_advisory_unlock_all() zamiast. Wtedy nie będziesz musiał przechowywać pobranych identyfikatorów.

Pamiętaj, że to nie uniemożliwić innym odczytywanie wierszy przy użyciu "normalnych" wyborów. Będzie działać tylko wtedy, gdy każdy proces, który uzyskuje dostęp do tej tabeli, używa tego samego wzorca uzyskiwania blokad.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konwerter typu identyfikatora agregatu Axon

  2. django.db.utils.ProgrammingError:relacja app_user nie istnieje podczas testu manage.py

  3. (Postgresql) powoduje, że funkcja wyzwalacza tabeli wstawia wartość identyfikatora zmienionego wiersza do tabeli dziennika, dla niestandardowej replikacji

  4. Próba zmodyfikowania ograniczenia w PostgreSQL

  5. Błąd kodowania w sqlalchemy i postgresql